Diberikan:
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()
Apakah ada cara untuk membuat completionparameter (dan action) bertipe Action?dan juga menyimpannya @escaping?
Mengubah jenisnya memberikan kesalahan berikut:
Atribut @escaping hanya berlaku untuk tipe fungsi
Menghapus @escapingatribut, kode mengkompilasi dan menjalankan, tetapi tampaknya tidak benar karena completionpenutupan keluar dari ruang lingkup fungsi.
@escapingatribut, kode mengkompilasi dan menjalankan" - Itu karena, seperti yang dijelaskan dalam SR-2444 ,Action?secara default, melarikan diri. Jadi, melepas@escapingketika menggunakan penutupan opsional memenuhi apa yang Anda butuhkan.