Swift Language
Die Verschiebungserklärung
Suche…
Wann wird eine Aufschubanweisung verwendet?
Eine defer
Anweisung besteht aus einem Codeblock, der ausgeführt wird, wenn eine Funktion zurückgegeben wird und für die Bereinigung verwendet werden sollte.
Als Swift guard
Aussagen einen Stil der frühen Rückkehr zu fördern, können viele mögliche Wege für eine Rückkehr gibt. Eine defer
stellt Bereinigungscode bereit, der dann nicht jedes Mal wiederholt werden muss.
Es kann auch Zeit beim Debuggen und Profilieren sparen, da Speicherverluste und ungenutzte offene Ressourcen aufgrund einer vergessenen Bereinigung vermieden werden.
Es kann verwendet werden, um einen Puffer am Ende einer Funktion freizugeben:
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.
Es kann auch verwendet werden, um Ressourcen am Ende einer Funktion zu schließen:
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
Wenn Sie KEINE Verschiebungsanweisung verwenden
Stellen Sie bei Verwendung einer verzögerten Anweisung sicher, dass der Code lesbar bleibt und die Ausführungsreihenfolge klar bleibt. Die folgende Verwendung der Zurückstellungsanweisung macht beispielsweise die Ausführungsreihenfolge und die Funktion des Codes schwer verständlich.
postfix func ++ (inout value: Int) -> Int {
defer { value += 1 } // do NOT do this!
return value
}