什么是斯威夫特代码中的“无主自我”?

时间:2017-01-15 17:41:21

标签: swift

我遇到了这个我不明白的Swift代码。什么是被分配的navigationCallback?什么是[unowned self]?如果我能在Objective-C中看到相同的例子,我想我会更好地理解这一点。

navigationCallback = { [unowned self] in
    previousNavigationCallback?()
    if self.state != .Canceled {
        callback()
    }
}

2 个答案:

答案 0 :(得分:6)

  

分配给哪个navigationCallback?

花括号中的东西构成一个匿名函数。它就像Objective-C中的documentation

  

什么是[unowned self]

匿名函数捕获列表中in之前的方括号中的内容。它通过将self带入未获取的匿名函数来阻止保留周期。 unowned类似于Objective-C中的assign属性政策(非ARC weak)。在Objective-C中,您通常会执行block以执行类似操作。

答案 1 :(得分:3)

该构造称为“捕获列表”。正如Matt所说,它允许闭包/块/匿名函数在块内具有对self的无主引用。它允许您避免由对创建它们的对象具有强引用的闭包引起的保留周期,此时创建对象也具有对闭包的强引用。

Apple的Swift iBook中详细介绍了这一点。这是一个简短的摘录:

  

解决闭包的强引用周期您解决了强大的

     

闭包和类实例之间的引用循环   将捕获列表定义为闭包定义的一部分。捕获   list定义捕获一个或多个引用时要使用的规则   封闭体内的类型。与强参考周期一样   在两个类实例之间,您声明每个捕获的引用   一个弱的或无主的参考而不是一个强有力的参考。该   适当选择弱或无主取决于关系   在代码的不同部分之间。

摘自:Apple Inc.“Swift编程语言(Swift 2)。”iBooks。 https://itun.es/us/jEUH0.l