首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift中的隐式惰性静态成员

Swift中的隐式惰性静态成员
EN

Stack Overflow用户
提问于 2016-01-08 07:36:11
回答 1查看 26.2K关注 0票数 67

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

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

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

var z = Foo.bar
z = Foo.bar

这背后的理由是什么?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-08 07:49:32

static属性定义了一个“类型属性”,该属性只实例化一次。正如您所注意到的,这种情况发生得很慢,因为静态变量的行为类似于全局变量。正如The Swift Programming Language: Properties所说:

Lazy Stored Properties类似,

全局常量和变量的计算总是很慢。与惰性存储属性不同,全局常量和变量不需要使用lazy修饰符进行标记。

这种隐含的懒惰行为是因为,正如Swift Blog: Files and Initialization所说:

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

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

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

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

票数 115
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34667134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档