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.