Saya mencoba memahami 'Penutupan' Swift dengan lebih tepat.
Tapi @escaping
dan Completion Handler
terlalu sulit untuk dimengerti
Saya mencari banyak postingan Swift dan dokumen resmi, tetapi saya merasa itu masih belum cukup.
Ini adalah contoh kode dokumen resmi
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
Saya mendengar bahwa ada dua cara dan alasan yang menggunakan @escaping
Pertama untuk menyimpan closure, kedua untuk tujuan pengoperasian Async.
Berikut adalah pertanyaan saya :
Pertama, jika doSomething
dieksekusi maka someFunctionWithEscapingClosure
akan dieksekusi dengan parameter closure dan closure tersebut akan disimpan dalam larik variabel global.
Saya pikir penutupannya adalah {self.x = 100}
Bagaimana self
di {self.x = 100} yang disimpan dalam variabel global completionHandlers
dapat terhubung ke instance
objek itu SomeClass
?
Kedua, saya memahami someFunctionWithEscapingClosure
seperti ini.
Untuk menyimpan penutupan variabel lokal completionHandler
ke variabel global we using
kata kunci 'completeHandlers @ escaping`!
tanpa pengembalian @escaping
kata kunci someFunctionWithEscapingClosure
, variabel lokal completionHandler
akan dihapus dari memori
@escaping
adalah menyimpan penutupan itu dalam memori
Apakah ini benar?
Terakhir, saya hanya ingin tahu tentang keberadaan tata bahasa ini.
Mungkin ini pertanyaan yang sangat mendasar.
Jika kita ingin beberapa fungsi dijalankan setelah beberapa fungsi tertentu. Mengapa kita tidak memanggil beberapa fungsi setelah panggilan fungsi tertentu?
Apa perbedaan antara menggunakan pola di atas dan menggunakan fungsi panggilan balik pelolosan?