从Swift 1.x开始,Swift一直
dispatch_once
在幕后使用全局变量和静态属性执行线程安全的延迟初始化。
因此,
staticvar上面的代码已经被使用了
dispatch_once,这使其变得很奇怪(再次使用它作为另一个对象的令牌可能会产生问题
dispatch_once。实际上,
dispatch_once如果没有这种递归,实际上是没有安全的方法可以使用的,因此他们放弃了。)
,只需使用基于其构建的语言功能:
// global constant: SomeClass initializer gets called lazily, only on first uselet foo = SomeClass()// global var, same thing happens here// even though the "initializer" is an immediately invoked closurevar bar: SomeClass = { let b = SomeClass() b.someProperty = "whatever" b.doSomeStuff() return b}()// ditto for static properties in classes/structures/enumsclass MyClass { static let singleton = MyClass() init() { print("foo") }}因此,如果您一直使用
dispatch_once一次 初始化 来产生某个值,那就太好了-您可以将该值设为要初始化的全局变量或静态属性。
但是,如果您
dispatch_once用来做不一定会产生结果的工作该怎么办?您仍然可以使用全局变量或静态属性来执行此操作:只需将变量的类型设为
Void:
let justAOneTimeThing: () = { print("Not coming back here.")}()而且,如果访问全局变量或静态属性来执行一次性工作对您来说并不适合-例如,您希望客户在使用库之前调用“初始化我”功能-只需包装一下访问功能:
func doTheoneTimeThing() { justAOneTimeThing}有关更多信息,请参见迁移指南。



