我只是注意到staticSwift的成员structs是隐式的lazy。
static
structs
lazy
例如,这只会调用init一次:
init
class Baz { init(){ print("initializing a Baz") } } struct Foo { static let bar = Baz() } var z = Foo.bar z = Foo.bar
这背后的原理是什么?
如果我想要相反的行为怎么办?
该static属性定义了一个“类型属性”,该属性仅被实例化一次。正如您所注意到的,这是懒惰发生的,因为静态行为就像全局变量一样。正如Swift编程语言:属性所说:
全局常量和变量总是以与惰性存储属性类似的方式延迟计算。与惰性存储的属性不同,全局常量和变量不需要用lazy修饰符标记。
这种隐式的懒惰行为是因为,正如Swift博客:文件和初始化所说:
它允许自定义初始化程序,Swift中的启动时间可以干净地缩放,而无需全局初始化程序来降低它的速度,并且执行顺序是完全可预测的。
他们有意识地设计了这种方式,以避免不必要地延迟应用程序的启动。
如果要static在应用程序中的某个特定位置实例化该属性(而不是将其推迟到首次使用该static属性的位置),只需在较早的时间点引用该属性,该对象将在该时间初始化。考虑到我们为减少启动应用程序的延迟所做的努力,您通常不会在应用程序的首次启动期间同步地希望这样做,但是您可以在任何地方进行。