Swift Language
De verklaring van uitstel
Zoeken…
Wanneer een uitstelinstructie te gebruiken
Een defer
bestaat uit een codeblok dat wordt uitgevoerd wanneer een functie terugkeert en moet worden gebruikt voor het opschonen.
Omdat de guard
Swift een stijl van vroege terugkeer aanmoedigen, kunnen er vele mogelijke paden voor een terugkeer bestaan. Een defer
biedt opschooncode, die dan niet elke keer hoeft te worden herhaald.
Het kan ook tijd besparen tijdens het debuggen en profileren, omdat geheugenlekken en ongebruikte open bronnen als gevolg van vergeten opschonen kunnen worden vermeden.
Het kan worden gebruikt om een buffer aan het einde van een functie toe te wijzen:
func doSomething() {
let data = UnsafeMutablePointer<UInt8>(allocatingCapacity: 42)
// this pointer would not be released when the function returns
// so we add a defer-statement
defer {
data.deallocateCapacity(42)
}
// it will be executed when the function returns.
guard condition else {
return /* will execute defer-block */
}
} // The defer-block will also be executed on the end of the function.
Het kan ook worden gebruikt om bronnen aan het einde van een functie te sluiten:
func write(data: UnsafePointer<UInt8>, dataLength: Int) throws {
var stream:NSOutputStream = getOutputStream()
defer {
stream.close()
}
let written = stream.write(data, maxLength: dataLength)
guard written >= 0 else {
throw stream.streamError! /* will execute defer-block */
}
} // the defer-block will also be executed on the end of the function
Wanneer NIET een uitstelverklaring gebruiken
Let er bij het gebruik van een uitstelverklaring op dat de code leesbaar blijft en dat de uitvoeringsvolgorde duidelijk blijft. Het volgende gebruik van de uitstel-instructie maakt de uitvoeringsvolgorde en de functie van de code bijvoorbeeld moeilijk te begrijpen.
postfix func ++ (inout value: Int) -> Int {
defer { value += 1 } // do NOT do this!
return value
}