Middle
Escape va non-escape yopilishlar orasidagi farqni tushuntiring va qaysi hollarda @escaping ni ishlatish kerakligini aytib bering.
sobes.tech AI
AIdan javob
Default yopishlar escapeless hisoblanadi.
Escapeless yopish:
- U funksiyaning tanasida bajariladi, unga o'tkaziladi.
- O'zgaruvchilarni ushlaydi, lekin funksiyaning yakunidan so'ng ozod qiladi.
- Funktsiyadan o'tmaydi.
func doSomething(completion: () -> Void) {
// completion chaqiriladi
completion()
}
Escaping yopish:
- U funksiyadan qaytganidan so'ng bajariladi.
- Funktsiya tanasidan o'tib qoladi.
- Keyinchalik bajarish uchun saqlanishi mumkin, masalan, boshqa oqimda yoki asinxron tarzda.
- O'zgaruvchilarni ushlab turadi, kuchli havolalarni saqlab qoladi, bu kuchli havola sikllariga olib kelishi mumkin. Aniq
@escapingbelgilash talab qilinadi.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Vazifalarni bajarish...
for handler in completionHandlers {
handler() // Keyinchalik chaqirish
}
}
}
@escaping foydalanish quyidagi hollarda zarur:
- Yopishma klass yoki tuzilma xususiyatida saqlanadigan bo'lsa.
- Yopishma boshqa oqimga yoki asinxron operatsiyaga uzatilgan bo'lsa (masalan, tarmoq so'rovi, GCD, OperationQueue).
- Yopishma voqea yoki delegat sifatida ishlatilsa.