因为这强烈捕获了self
,它在执行闭包之前可能已超出范围:
OperationQueue().addOperation {
self.someFunction()
}
......在这些情况下,我会轻微捕获self
并使用警卫检查它仍在范围内。
我曾经这样写过:
OperationQueue().addOperation { [weak self] in
guard let `self` = self else { return }
self.someFunction()
}
但是后来发现只有编译错误才能正常工作! https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html
所以现在我使用不同的常量名称。读其他民族'我看到的最常见的代码是:
OperationQueue().addOperation { [weak self] in
guard let weakSelf = self else { return }
weakSelf.someFunction()
}
但是当然self
对那个后卫很强大?所以应该这样写:
OperationQueue().addOperation { [weak self] in
guard let strongSelf = self else { return }
strongSelf.someFunction()
}
是否有最佳方式来编写此内容?
-
更新 - 为什么在这种情况下,可选链接不是最佳选择:
如果闭包中有多个self
调用,并且self
在执行闭包期间超出了范围,那么最终可能会出现意外状态。
还有一名警卫向下一位开发人员显示此功能需要self
才能正常工作,即在没有self
的情况下运行闭包没有意义。
答案 0 :(得分:4)
从Swift 4.2开始,您可以使用guard let self = self else { return }
来展开weak self
。无需使用strongSelf
或`self`
编译器错误进行解包。
您可以在Swift evolution proposal中阅读有关它的更多信息。
答案 1 :(得分:0)
您可以通过以下方式为对象指定捕获列表中的名称:
OperationQueue().addOperation { [weak object = self] in
guard let object = object else { return }
object.someFunction()
}