Dany:
typealias Action = () -> ()
var action: Action = { }
func doStuff(stuff: String, completion: @escaping Action) {
print(stuff)
action = completion
completion()
}
func doStuffAgain() {
print("again")
action()
}
doStuff(stuff: "do stuff") {
print("swift 3!")
}
doStuffAgain()
Czy istnieje sposób, aby completion
parametr (i action
) był typem, Action?
a także zachować @escaping
?
Zmiana typu powoduje następujący błąd:
Atrybut @escaping dotyczy tylko typów funkcji
Po usunięciu @escaping
atrybutu kod kompiluje się i uruchamia, ale nie wydaje się być poprawny, ponieważ completion
zamknięcie wymyka zakres funkcji.
@escaping
atrybutu powoduje kompilację i uruchomienie kodu” - Dzieje się tak, ponieważ, jak opisano w SR-2444 ,Action?
domyślnie stosuje się znaki ucieczki. Tak więc usunięcie@escaping
podczas korzystania z opcjonalnego zamknięcia spełnia Twoje potrzeby.