Wann gilt eine Closure in Swift als escaping, auch wenn im Code nicht das Schlüsselwort @escaping angegeben ist?
sobes.tech KI
Antwort von AI
In Swift gilt eine Closure als escaping, wenn sie gespeichert und nach Abschluss der Funktion aufgerufen wird, an die sie übergeben wurde. Für solche Closures ist es in der Regel notwendig, explizit @escaping anzugeben.
Es gibt jedoch Fälle, in denen eine Closure auch ohne explizites @escaping als escaping gilt:
- Wenn die Closure als Parameter einer Funktion verwendet wird, die selbst mit
@escapingfür diesen Parameter deklariert ist. - Bei der Verwendung von Closures in asynchronen Operationen, z.B. in APIs, bei denen die Closure gespeichert wird, um später aufgerufen zu werden (z.B. in DispatchQueue oder URLSession).
Das heißt, wenn die Closure weitergegeben und nach Verlassen der aktuellen Funktion aufgerufen wird, verlangt der Compiler @escaping. Wenn @escaping nicht angegeben ist, die Closure aber tatsächlich gespeichert und später aufgerufen wird, führt dies zu einem Kompilierungsfehler.
Beispiel:
func performAsyncTask(completion: @escaping () -> Void) {
DispatchQueue.global().async {
// Asynchrone Arbeit
completion() // später aufgerufen
}
}
Wenn @escaping entfernt wird, gibt der Compiler einen Fehler aus, da completion nach Verlassen der Funktion aufgerufen wird.
Daher gilt eine Closure als escaping, wenn sie gespeichert und später aufgerufen wird, auch wenn im Code nicht explizit @escaping angegeben ist (z.B. bei Vererbung der Signatur oder bei der Verwendung von APIs, bei denen dies impliziert ist).