一尘不染

Swift中的隐式惰性成员

swift

我只是注意到staticSwift的成员structs是隐式的lazy

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

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

var z = Foo.bar
z = Foo.bar

这背后的原理是什么?

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


阅读 175

收藏
2020-07-07

共1个答案

一尘不染

static属性定义了一个“类型属性”,该属性仅被实例化一次。正如您所注意到的,这是懒惰发生的,因为静态行为就像全局变量一样。正如Swift编程语言:属性所说:

全局常量和变量总是以与惰性存储属性类似的方式延迟计算。与惰性存储的属性不同,全局常量和变量不需要用lazy修饰符标记。

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

它允许自定义初始化程序,Swift中的启动时间可以干净地缩放,而无需全局初始化程序来降低它的速度,并且执行顺序是完全可预测的。

他们有意识地设计了这种方式,以避免不必要地延迟应用程序的启动。

如果要static在应用程序中的某个特定位置实例化该属性(而不是将其推迟到首次使用该static属性的位置),只需在较早的时间点引用该属性,该对象将在该时间初始化。考虑到我们为减少启动应用程序的延迟所做的努力,您通常不会在应用程序的首次启动期间同步地希望这样做,但是您可以在任何地方进行。

2020-07-07