Swift 中的隐式惰性静态成员

我刚刚注意到 Swift structsstatic成员是隐式的 lazy

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

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


var z = Foo.bar
z = Foo.bar

这背后的理由是什么?

如果我想要相反的行为呢?

30396 次浏览

static属性定义了一个“ type 属性”,该属性实例化一次且仅实例化一次。正如您所注意到的,这种情况发生得很慢,因为静态的行为类似于全局变量。正如 快速编程语言: 属性所说:

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

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

它允许自定义初始化器,启动时间在 Swift 规模干净,没有全局初始化器来减慢它,并且执行顺序是完全可预测的。

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

如果你想在应用程序的某个特定点实例化 static属性(而不是将其推迟到首次使用它的地方) ,只需在那个早期点引用这个 static属性,对象就会在那个时候被初始化。考虑到我们在减少应用程序启动延迟方面所付出的努力,你通常不会希望在应用程序初始化时同步启动,但是你可以在任何你想要的地方同步启动。


注意,与 lazy实例属性不同,全局变量和 static变量的实例化是线程安全的。