31

对于闭包,我通常会附加[weak self]到我的捕获列表中,然后对自身进行空检查:

func myInstanceMethod()
{
    let myClosure =
    {
       [weak self] (result : Bool) in
       if let this = self
       { 
           this.anotherInstanceMethod()
       }
    }   

    functionExpectingClosure(myClosure)
}

self如果我使用嵌套函数代替闭包,我如何执行空检查(或者检查是否必要......或者使用这样的嵌套函数是否是一种好习惯),即

func myInstanceMethod()
{
    func nestedFunction(result : Bool)
    {
        anotherInstanceMethod()
    }

    functionExpectingClosure(nestedFunction)
}
4

2 回答 2

36

不幸的是,只有闭包具有“捕获列表”功能,例如[weak self]. 对于嵌套函数,您必须使用普通weakunowned变量。

func myInstanceMethod() {
    weak var _self = self
    func nestedFunction(result : Bool) {
        _self?.anotherInstanceMethod()
    }

    functionExpectingClosure(nestedFunction)
}
于 2014-10-31T07:34:39.153 回答
-4

似乎不再是这种情况了。这在 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捕获?

于 2018-06-05T15:06:45.243 回答