Geschiedenis van de vraag:
Defer werd toegevoegd in Swift (geïnspireerd door vergelijkbare constructies in Go, C#) om een gegarandeerde opruiming van hulpbronnen te waarborgen, zelfs bij fouten, het verlaten van een functie of het retourneren van waarden uit verschillende punten in functies.
Probleem:
Vroege vrijgave, vergeten opruimingen van hulpbronnen (bijvoorbeeld bestanden sluiten, logging, rollback van transacties). Soms wordt de volgorde van uitvoering verward, waarbij ten onrechte wordt gedacht dat defer wordt uitgevoerd op het moment van declaratie.
Oplossing:
Defer is een speciale blok dat de uitvoering van code uitstelt tot het einde van de huidige scope, meestal de functie. Alle defer-blokken worden in omgekeerde volgorde van plaatsing uitgevoerd (LIFO). Dit stelt je in staat om de opruiming van hulpbronnen, geheugen vrijgeven of rollback van transacties centraal te beheren.
Voorbeeldcode:
func processFile() { let file = File("/tmp/data.txt") file.open() defer { file.close() print("Bestand gesloten") } // Werken met het bestand print("Gegevens lezen…") }
Belangrijkste kenmerken:
Wordt de code binnen defer uitgevoerd bij een crash van de applicatie voordat de functie verlaat?
Nee, de code binnen defer wordt alleen uitgevoerd bij een correcte uitgang uit de scope. Als de applicatie in een fatale fout eindigt, wordt defer niet uitgevoerd.
Kan return binnen defer worden gebruikt?
Nee, dat kan niet. Een defer-blok staat geen waarde retour of het beëindigen van de scope toe, alleen instructies.
Kan defer worden gebruikt om variabelen te modificeren die vóór defer zijn gedeclareerd?
Ja, defer vangt waarden van de huidige stack op het moment van uitvoering. Je kunt waarden die vóór defer zijn gedeclareerd wijzigen en deze zullen behouden blijven bij het verlaten van de scope.
Voorbeeldcode:
func example() -> Int { var result = 0 defer { result = 42 } return result // defer wordt uitgevoerd, resultaat — 42 }
Het bestand wordt geopend, maar wordt alleen expliciet aan het einde van de functie gesloten, en bij fouten of vroegtijdig verlaten van de functie blijft het bestand open.
Voordelen:
Nadelen:
Gebruik defer om het bestand onmiddellijk na opening te sluiten. Zelfs als er een uitzondering optreedt of bij retour uit de functie, wordt het bestand gegarandeerd gesloten.
Voordelen:
Nadelen: