访问" self"初始化关闭

时间:2016-09-18 10:30:15

标签: swift swift3

在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'关闭时无法访问,如何实现?

2 个答案:

答案 0 :(得分:4)

这个引用的迁移指南示例具有误导性,因为它与全局变量有关。 在初始化类时,立即调用实例的闭包(一次)。这就是为什么它不能使用在同一级别上声明的其他变量的原因。 你可以做的是懒洋洋地初始化initialize(变量名不是最好的;-))。封闭也只被调用一次,但正如指南所描述的那样 - 仅在第一次(何时)使用它。 class SomeClass {   let other = SomeOtherClass()   lazy var initialize:()= {     让test = self.other     test.doSomething()   }()   func doSomething(){     //初始化只会被调用一次     _ =初始化   } }

答案 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.
}