Swift Language
Il Defer Statement
Ricerca…
Quando utilizzare una dichiarazione di differimento
Una dichiarazione di defer
costituita da un blocco di codice, che verrà eseguito quando una funzione ritorna e dovrebbe essere utilizzata per la pulizia.
Poiché le dichiarazioni di guard
di Swift incoraggiano uno stile di ritorno anticipato, possono esistere molti possibili percorsi per un ritorno. Una dichiarazione di defer
fornisce il codice di pulizia, che non deve essere ripetuto ogni volta.
Può anche risparmiare tempo durante il debugging e il profiling, poiché è possibile evitare perdite di memoria e risorse aperte non utilizzate a causa di una pulizia dimenticata.
Può essere usato per deallocare un buffer alla fine di una funzione:
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.
Può anche essere usato per chiudere le risorse alla fine di una funzione:
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
Quando NON usare una dichiarazione di differimento
Quando si utilizza una dichiarazione di differimento, assicurarsi che il codice rimanga leggibile e che l'ordine di esecuzione rimanga chiaro. Ad esempio, il seguente uso dell'istruzione differimento rende l'ordine di esecuzione e la funzione del codice difficili da comprendere.
postfix func ++ (inout value: Int) -> Int {
defer { value += 1 } // do NOT do this!
return value
}