【问题标题】:How to prevent lazy loading of static variables in Swift如何防止在 Swift 中延迟加载静态变量
【发布时间】:2016-12-12 06:49:20
【问题描述】:

我编写了一个 Swift 实用程序类,我在其中定义了几个静态方法和一个私有静态常量。但是,我希望在第一次引用类之后立即加载这个常量,而不是懒惰地加载。我唯一能想到的就是在每个静态函数中引用静态常量,如下所示:

private static let myObserver: Observer = {
    let observer = Observer(actionToPerform: foo1)
    SomeOtherClass.register(observer)
    return observer
}()

static func foo1() {
    _ = myObserver
    ...
}

static func foo2() {
    _ = myObserver  
    ...
}

static func foo3() {
    _ = myObserver
    ...
}

//even more of a hassle:
static let myIntConstant: Int = {
    _ = myObserver
    return 5
} ()

.
.
.

但是,该解决方案看起来很丑陋。有没有更清洁的方法?我可以使用某种 class 初始化回调吗?

【问题讨论】:

  • 你为什么不使用单例类呢?
  • @Mohammadalijf 这总是有可能的。但我很想知道是否有针对静态内容的解决方案。

标签: ios swift lazy-loading lazy-evaluation lazy-initialization


【解决方案1】:

好的,我似乎找到了一个可行的解决方案来解决我自己的问题。

  1. 确保该类是NSObject 的子类。
  2. 插入以下代码:

override class func initialize() { 
     _ = myObserver
}

执行此操作后,在引用类后立即加载静态常量,如需要。

当然,这种方法受限于类必须是NSObject 的子类这一事实,这可能不适用于所有此类。这种方法的任何其他潜在缺点都将受到欢迎!

【讨论】:

  • 是的,我原来的答案是错误的,因为如果您在 iOS 上使用 Swift,您自然必须能够从 NSObject 继承并有权访问 initialize()。如果你问我,它确实有点“神奇”的感觉,但它的官方名称是 documented 和 NSHipster has 一些 articles 在这方面应该不会太糟糕。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多