Middle
Leg uit wat het verschil is tussen escaping en non-escaping closures, en in welke gevallen @escaping gebruikt moet worden.
sobes.tech AI
Antwoord van AI
Standaard-closures zijn niet-escaping.
Niet-escaping closure:
- Wordt uitgevoerd in de body van de functie waaraan het wordt doorgegeven.
- Vangt variabelen op, maar vrijlaat ze na het voltooien van de functie.
- Overleeft de functie niet.
func doSomething(completion: () -> Void) {
// Aanroep van completion hier
completion()
}
Escaping closure:
- Wordt uitgevoerd nadat de functie waarvan het wordt doorgegeven terugkeert.
- Overleeft de body van de functie.
- Kan worden opgeslagen voor latere uitvoering, bijvoorbeeld in een andere thread of asynchroon.
- Vangt variabelen op, behoudt sterke referenties, wat kan leiden tot sterke referentiecirkels (retention cycles). Vereist expliciete declaratie
@escaping.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Taken uitvoeren...
for handler in completionHandlers {
handler() // Handlers later aanroepen
}
}
}
Gebruik van @escaping is nodig in de volgende gevallen:
- Wanneer de closure wordt opgeslagen in een eigenschap van een klasse of structuur.
- Wanneer de closure wordt doorgegeven aan een andere thread of asynchrone operatie (bijvoorbeeld, netwerkverzoek, GCD, OperationQueue).
- Wanneer de closure wordt gebruikt als event-handler of delegate.