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).
- Агар ёпиқ ҳодиса ёки делегат сифатида ишлатилса.