在嵌套函数中自我捕获

时间:2014-10-30 23:18:03

标签: swift

使用闭包我通常会将[弱自我]附加到我的捕获列表中,然后对自我进行空检查:

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)
}

3 个答案:

答案 0 :(得分:25)

不幸的是,只有闭包有"捕获列表"像[weak self]这样的功能。对于嵌套函数,您必须使用普通的weakunowned变量。

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

    functionExpectingClosure(nestedFunction)
}

答案 1 :(得分:0)

我使用此模板

class A{

  func foo(){

     func bar(_ this:A){
       this.some();
     }

     bar(self);
  }

  func some(){

  }

}

答案 2 :(得分:-2)

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