Sobes.tech
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 @escaping belgilash 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.