Подтвердить что ты не робот

Является захваченным внутри внутри вложенной функции

С закрытием я обычно добавляю [слабое я] в свой список захвата, а затем выполняю нулевую проверку 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)
}
4b9b3361

Ответ 1

К сожалению, только Closures имеют функцию "Capture List", такую ​​как [weak self]. Для вложенных функций вы должны использовать обычные переменные weak или unowned.

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

    functionExpectingClosure(nestedFunction)
}

Ответ 2

Я использую этот шаблон

class A{

  func foo(){

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

     bar(self);
  }

  func some(){

  }

}

Ответ 3

Похоже, это не так. Это действительно в 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 захватили?