Saya mencoba memahami 'Penutupan' Swift dengan lebih tepat.
Tapi @escapingdan Completion Handlerterlalu 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 doSomethingdieksekusi maka someFunctionWithEscapingClosureakan dieksekusi dengan parameter closure dan closure tersebut akan disimpan dalam larik variabel global.
Saya pikir penutupannya adalah {self.x = 100}
Bagaimana selfdi {self.x = 100} yang disimpan dalam variabel global completionHandlersdapat terhubung ke instanceobjek itu SomeClass?
Kedua, saya memahami someFunctionWithEscapingClosureseperti ini.
Untuk menyimpan penutupan variabel lokal completionHandlerke variabel global we usingkata kunci 'completeHandlers @ escaping`!
tanpa pengembalian @escapingkata kunci someFunctionWithEscapingClosure, variabel lokal completionHandlerakan 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?
