Szukaj…


Wprowadzenie

Z Swift Documentarion

Mówi się, że zamknięcie ucieka z funkcji, gdy zamknięcie jest przekazywane jako argument funkcji, ale wywoływane jest po powrocie funkcji. Kiedy deklarujesz funkcję, która przyjmuje zamknięcie jako jeden z jego parametrów, możesz napisać @ scaping przed typem parametru, aby wskazać, że zamknięcie może uciec.

Zamknięcie niekapiące

W Swift 1 i 2 parametry zamknięcia domyślnie uciekały. Jeśli wiedziałeś, że zamknięcie nie ucieknie z funkcji, możesz oznaczyć parametr za pomocą atrybutu @noescape.

W Swift 3 jest odwrotnie: parametry zamknięcia domyślnie nie są zmienne. Jeśli zamierzasz wyjść z funkcji, musisz zaznaczyć ją za pomocą atrybutu @escaping.

class ClassOne {
  // @noescape is applied here as default
  func methodOne(completion: () -> Void) {
    // 
  }
}

class ClassTwo {
  let obj = ClassOne()
  var greeting = "Hello, World!"

  func methodTwo() {
    obj.methodOne() {
      // self.greeting is required
      print(greeting)
    }
  }
}

Uciekające zamknięcie

Z Swift Documentarion

@scaping

Zastosuj ten atrybut do typu parametru w deklaracji metody lub funkcji, aby wskazać, że wartość parametru można zapisać do późniejszego wykonania. Oznacza to, że wartość może przeżyć okres ważności połączenia. Parametry typu funkcji z atrybutem typu Escape wymagają jawnego użycia self. dla właściwości lub metod.

class ClassThree {

    var closure: (() -> ())?

    func doSomething(completion: @escaping () -> ()) {
        closure = finishBlock
    }
}

W powyższym przykładzie blok zakończenia jest zapisywany do zamknięcia i dosłownie będzie żył poza wywołaniem funkcji. Tak więc kompilator zmusi oznaczenie bloku zakończenia jako @escaping.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow