Sobes.tech
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.