我刚刚注意到Swift structs
的static
成员都是隐含的lazy
。
例如,这将只调用init
一次:
class Baz {
init(){
print("initializing a Baz")
}
}
struct Foo {
static let bar = Baz()
}
var z = Foo.bar
z = Foo.bar
这背后的理由是什么?
如果我想要相反的行为呢?
发布于 2016-01-08 07:49:32
static
属性定义了一个“类型属性”,该属性只实例化一次。正如您所注意到的,这种情况发生得很慢,因为静态变量的行为类似于全局变量。正如The Swift Programming Language: Properties所说:
全局常量和变量的计算总是很慢。与惰性存储属性不同,全局常量和变量不需要使用
lazy
修饰符进行标记。
这种隐含的懒惰行为是因为,正如Swift Blog: Files and Initialization所说:
它允许自定义初始化器,在Swift中的启动时间可以干净地扩展,没有全局初始化器来减慢它的速度,并且执行的顺序是完全可预测的。
他们有意识地这样设计,以避免不必要地延迟应用程序的启动。
如果您想在应用程序中的某个特定位置实例化static
属性(而不是将其推迟到第一次使用的位置),只需在较早的位置引用此static
属性,对象就会在那时初始化。考虑到我们在减少应用程序启动时的延迟方面所做的努力,你通常不会希望在应用程序的初始启动期间同步执行这一操作,但你可以在任何你想要的地方这样做。
请注意,与lazy
实例属性不同,全局变量和static
变量的实例化是线程安全的。
https://stackoverflow.com/questions/34667134
复制相似问题