我试图理解defer
语句在Swift 2中是如何工作的,因为我显然不能正确理解它。
我有一个postprocess()
方法,只有在view
实例化时才会被调用:
internal func postprocess() {
assert(self.node.isViewInstantiated()) // <- this is failing using the first method
...
}
我原本试图像这样称呼它:
public var view: UIView {
get {
if !node.isViewInstantiated() {
defer {
postprocess()
}
}
return node.view // node.view getter creates view
}
}
但是这引起了断言。当我把它改成它时,它开始工作:
public var view: UIView {
get {
if node.isViewInstantiated() {
return node.view
} else {
var result = node.view
postprocess()
return result
}
}
(请注意node.view
是自我实例化的,因此isViewIntantiated()
。)
有人可以解释defer
实际上不推迟的原因吗?
答案 0 :(得分:4)
当当前范围退出时,Swift的defer
关键字将一个块排队以执行,这与函数返回时不一定相同。
当您离开defer
块的范围时,if
块内的if
块将被执行。
您可以重写您的代码:
public var view: UIView {
get {
let shouldPostProcess = !node.isViewInstantiated
defer {
if shouldPostProcess {
postprocess()
}
}
return node.view // node.view getter creates view
}
}
它应该完美无缺。现在,defer
- ed块的范围限定为get
方法调用,并在返回时执行,其前限为if
块并作为if
块执行范围退出。