Swift Language
Bloki
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.