Swift中隐式懒惰的静态成员

cfi*_*her 46 static lazy-loading static-members swift swift2

我只是注意到staticSwift的成员structs是含蓄的lazy.

例如,这只会调用init一次:

class Baz {
    init(){
        print("initializing a Baz")
    }
}
struct Foo {
    static let bar = Baz()
}

var z = Foo.bar
z = Foo.bar
Run Code Online (Sandbox Code Playgroud)

这背后的理由是什么?

如果我想要相反的行为怎么办?

Rob*_*Rob 86

static属性定义了一个"类型属性",一个实例化一次且仅一次.正如你所注意到的,这种情况很懒散,因为静态就像全局变量一样.正如The Swift Programming Language:Properties所说:

全局常量和变量总是懒惰地计算,与Lazy Stored Properties类似.与延迟存储的属性不同,全局常量和变量不需要使用lazy修饰符标记.

这种隐含的懒惰行为是因为,正如Swift博客:文件和初始化所说:

它允许自定义初始化程序,Swift中的启动时间干净利落,没有全局初始化程序来减慢它,并且执行顺序是完全可预测的.

他们有意识地设计它以避免不必要地延迟应用程序的启动.

如果要static在应用程序中的某个特定点实例化该属性(而不是将其推迟到首次使用的位置),只需static在该较早的位置引用此属性,该对象将在此时初始化.鉴于我们在减少启动应用程序的延迟方面所付出的努力,您通常不会在应用程序的首次启动期间同步,但您可以随时随地执行此操作.

  • 这很懒惰.我已经更新了我的答案以澄清这一点. (2认同)