Sobes.tech
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ű @escaping deklará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.