サーチ…


遅延ステートメントを使用するタイミング

defer文は、関数の復帰時に実行されるクリーンアップに使用されるコードブロックで構成されます。

スウィフトのguardステートメントは早期復帰のスタイルを奨励しているので、リターンのための多くの可能な経路が存在する可能性があります。 defer文は、毎回繰り返す必要のないクリーンアップコードを提供します。

また、忘れたクリーンアップによるメモリリークや未使用のオープンリソースを回避できるため、デバッグやプロファイリングの時間を節約できます。

関数の終わりにバッファの割り当てを解除するために使うことができます:

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.

また、関数の最後にリソースを閉じるために使用することもできます:

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

defer文を使用しない場合

defer-statementを使用する場合は、コードを読み込み可能な状態にし、実行順序を明確にしてください。たとえば、defer文を次のように使用すると、実行順序とコードの機能が理解しにくくなります。

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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow