我只是注意到static
Swift的成员structs
是含蓄的lazy
.
例如,这只会调用init
一次:
class Baz { init(){ print("initializing a Baz") } } struct Foo { static let bar = Baz() } var z = Foo.bar z = Foo.bar
这背后的理由是什么?
如果我想要相反的行为怎么办?
该static
属性定义了一个"类型属性",一个实例化一次且仅一次.正如你所注意到的,这种情况很懒散,因为静态就像全局变量一样.正如The Swift Programming Language:Properties所说:
全局常量和变量总是懒惰地计算,与Lazy Stored Properties类似.与延迟存储的属性不同,全局常量和变量不需要使用
lazy
修饰符标记.
这种隐含的懒惰行为是因为,正如Swift博客:文件和初始化所说:
它允许自定义初始化程序,Swift中的启动时间干净利落,没有全局初始化程序来减慢它,并且执行顺序是完全可预测的.
他们有意识地设计它以避免不必要地延迟应用程序的启动.
如果要static
在应用程序中的某个特定点实例化该属性(而不是将其推迟到首次使用的位置),只需static
在该较早的位置引用此属性,该对象将在此时初始化.鉴于我们在减少启动应用程序的延迟方面所付出的努力,您通常不会在应用程序的首次启动期间同步,但您可以随时随地执行此操作.