在Swift 3中,dispatch_once函数被删除,migration guide建议使用初始化闭包:
让myGlobal = {... global包含对闭包的调用初始化...}()
_ = myGlobal //使用myGlobal只会在第一次使用时调用初始化代码。
我想要访问“自我”'初始化闭包中的实例变量如下:
class SomeClass {
var other = SomeOtherClass()
let initialize: () = {
// self.other - this doesn't work, complains about unresolved identifier 'self'
// how to access self.other here?
} ()
func doSomething() {
// initialize will only be called once
initialize
}
}
为什么' self'关闭时无法访问,如何实现?
答案 0 :(得分:4)
答案 1 :(得分:1)
当创建'SomeClass'类的实例时,它将首先在该实例上创建所有变量和常量。在此期间,自我可能无法完全初始化,因为它可能是设置的一半。因此,直到初始化步骤完成后才能使用self。
在这个例子中,他们讨论的是一个没有自我概念的全局变量,或者类中没有静态概念的静态常量。
如果需要是实例方法/变量,您可以:
a)使它成为一个懒惰的变种
lazy var initialise : ()->Void = {
return {
// can access self here
}
}()
将在您第一次调用时创建,而不是在初始化期间创建。当然你会失去那种常数,而且你必须存储那个浪费的闭包,因为你只执行一次。
b)将代码放在init方法中:
init() {
// if your class doesn't have a super class, you can access self.other here.
// If it does have a super class (like NSObject) you must first call super.init() here to complete the initialisation.
// This can only be done after all other variables have been set.
}