Подано:
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()
Чи є спосіб зробити completionпараметр (і action) типу, Action?а також зберегти @escaping?
Зміна типу видає таку помилку:
Атрибут @escaping стосується лише типів функцій
Видаляючи @escapingатрибут, код компілюється та запускається, але, здається, не є правильним, оскільки completionзакриття виходить із сфери функції.
@escapingатрибута, код компілюється і працює» - це тому , що, як описано в SR-2444 ,Action?є, за замовчуванням, тікаючи. Отже, видалення@escapingпід час використання додаткового закриття здійснює те, що вам потрібно.