Sobes.tech
Middle

Тафсир диҳед фарқияти байни closures-и escaping ва non-escaping ва дар кадом ҳолатҳо зарур аст, ки @escaping истифода шавад.

sobes.tech AI

Ҷавоб аз AI

Дефолттаги ёпиқлар escapeless ҳисобланади.

Non-escaping ёпиқ:

  • У функциянинг танаида бажарилади, у қайтиб келади.
  • Ўзгарувчиларни ёки олади, аммо уларни функция тугашидан кейин озод қилади.
  • Функциядан ўта олмайди.
func doSomething(completion: () -> Void) {
    // completion чақирилади
    completion() 
}

Escaping ёпиқ:

  • У қайтиб келгандан кейин бажарилади.
  • Функция танаидан ўтади.
  • Кейинроқ бажариш учун сақланиши мумкин, масалан, бошқа тўрда ёки асинхрон.
  • Ўзгарувчиларни ёки олади, қавғо мустаҳкам ҳаволаларни сақлайди, бу қавғо ҳаволалар циклига (retain cycles) олиб келиши мумкин. Аниқ @escaping декларацияси талаб қилинади.
class DataManager {
    var completionHandlers: [() -> Void] = []

    func addCompletionHandler(handler: @escaping () -> Void) {
        completionHandlers.append(handler)
    }

    func performTasks() {
        // Вазирликларни бажариш...
        for handler in completionHandlers {
            handler() // Кейинроқ чақириш
        }
    }
}

@escaping қўлланиши қуйидаги ҳолларда зарур:

  • Агар ёпиқ класс ёки структуранинг хусусиятида сақланса.
  • Агар ёпиқ бошқа тўрга ёки асинхрон операцияга ўтказилса (масалан, тармоқ сўрови, GCD, OperationQueue).
  • Агар ёпиқ ҳодиса ёки делегат сифатида ишлатилса.