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
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow