Sobes.tech
Middle

Erklären Sie den Unterschied zwischen escaping und non-escaping Closures und in welchen Fällen @escaping verwendet werden muss.

sobes.tech KI

Antwort von AI

Standard-Closures sind nicht escapable.

Nicht-escapable Closure:

  • Wird im Körper der Funktion ausgeführt, an die sie übergeben wird.
  • Erfassen Variablen, aber geben sie nach Abschluss der Funktion frei.
  • Überlebt die Funktion nicht.
func doSomething(completion: () -> Void) {
    // Aufruf von completion hier
    completion() 
}

Escapable Closure:

  • Wird nach der Rückgabe der Funktion ausgeführt, an die sie übergeben wird.
  • Überlebt den Funktionskörper.
  • Kann für eine spätere Ausführung gespeichert werden, z.B. in einem anderen Thread oder asynchron.
  • Erfassen Variablen, indem sie starke Referenzen hält, was zu starken Referenzzyklen (retain cycles) führen kann. Erfordert die explizite Deklaration @escaping.
class DataManager {
    var completionHandlers: [() -> Void] = []

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

    func performTasks() {
        // Aufgaben ausführen...
        for handler in completionHandlers {
            handler() // Handler später aufrufen
        }
    }
}

Die Verwendung von @escaping ist in folgenden Fällen notwendig:

  • Wenn die Closure in einer Eigenschaft einer Klasse oder Struktur gespeichert wird.
  • Wenn die Closure an einen anderen Thread oder eine asynchrone Operation übergeben wird (z.B. Netzwerkrequest, GCD, OperationQueue).
  • Wenn die Closure als Ereignis-Handler oder Delegat verwendet wird.