使用闭包,我通常会将[weak self]
附加到捕获列表中,然后对self
:进行空检查
func myInstanceMethod()
{
let myClosure =
{
[weak self] (result : Bool) in
if let this = self
{
this.anotherInstanceMethod()
}
}
functionExpectingClosure(myClosure)
}
如果我使用嵌套函数代替闭包,我如何对self
执行null检查(或者检查是否有必要……或者使用这样的嵌套函数是否是一种好的做法),即
func myInstanceMethod()
{
func nestedFunction(result : Bool)
{
anotherInstanceMethod()
}
functionExpectingClosure(nestedFunction)
}
遗憾的是,只有闭包具有类似[weak self]
的"捕获列表"功能。对于嵌套函数,必须使用普通的weak
或unowned
变量。
func myInstanceMethod() {
weak var _self = self
func nestedFunction(result : Bool) {
_self?.anotherInstanceMethod()
}
functionExpectingClosure(nestedFunction)
}
似乎不再是这样了。这在swift 4.1:中有效
class Foo {
var increment = 0
func bar() {
func method1() {
DispatchQueue.main.async(execute: {
method2()
})
}
func method2() {
otherMethod()
increment += 1
}
method1()
}
func otherMethod() {
}
}
问题仍然存在:self
是如何被捕获的?