Middle
Magyarázza el a különbséget az escaping és non-escaping closures között, és hogy mikor kell használni az @escaping-et.
sobes.tech MI
Válasz az MI-től
Az alapértelmezett zárójelek nem escape-ek.
Nem escape zárójel:
- A végrehajtódik a függvény testében, amelyhez átadják.
- Elkapja a változókat, de felszabadítja őket a függvény befejezése után.
- Nem marad meg a függvény felett.
func doSomething(completion: () -> Void) {
// completion hívása itt
completion()
}
Escape zárójel:
- A függvény visszatérése után hajtódik végre.
- Megmarad a függvény testében.
- Tárolható későbbi végrehajtásra, például más szálon vagy aszinkron módon.
- Erőteljes referenciákat tartalmaz, ami ciklusokat (retain cycles) okozhat. Egyértelmű
@escapingdeklarációt igényel.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Feladatok végrehajtása...
for handler in completionHandlers {
handler() // Későbbi hívás
}
}
}
Az @escaping használata szükséges a következő esetekben:
- Amikor a zárójel egy osztály vagy struktúra tulajdonságában van tárolva.
- Amikor a zárójel más szálra vagy aszinkron műveletre van átadva (pl. hálózati kérés, GCD, OperationQueue).
- Amikor a zárójel eseménykezelőként vagy delegáltként van használva.