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 completionparametr (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 @escapingatrybutu kod kompiluje się i uruchamia, ale nie wydaje się być poprawny, ponieważ completionzamknięcie wymyka zakres funkcji.
@escapingatrybutu 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@escapingpodczas korzystania z opcjonalnego zamknięcia spełnia Twoje potrzeby.