Swift の defer 文

ここでは Swift の defer 文 についてご説明します。

Swift の defer 文の基本

Swift の defer 文を使うと、スコープを抜ける時に、指定したステートメントを実行することができます。

どんな状態でスコープを抜けても実行されるので、スコープ内で予期せぬエラーが起きた時の後処理にも使えます。


Swift の defer 文の構文は次の通りです。

defer {
    [ステートメント]
}


次の defer 文を実行してみます。

func testFunction1() {
    print("Statement 1")

    defer {
        print("Defer 1")
    }

    print("Statement 2")
}

testFunction1()

実行結果は次のようになります。

Statement 1
Statement 2
Defer 1

Swift の defer 文 1

print 文が Statement 1 -> Statement 2 -> Defer 1 の順番で実行されています。


defer 文内の変数について

defer 文内で使用されている変数の値などは、defer 文が実行される時点のものになります。

value という名前の変数に値を代入して defer 文内のステートメントで print してみます。

func testFunction2() {
    var value = 1
    print("Statement 1 - value: \(value)")

    defer {
        print("Defer 1 - value: \(value)")
    }

    value = 2
    print("Statement 2 - value: \(value)")
}

testFunction2()

実行結果は次のようになります。

Statement 1 - value: 1
Statement 2 - value: 2
Defer 1 - value: 2

Swift の defer 文 2

Defer 1 に続く value の値が 1 ではなく、2 になっていることがわかります。


複数の defer 文があるケース

defer 文が複数ある時は、先に定義されたものが後になるように反対の順番で実行されます。

func testFunction3() {
    print("Statement 1")

    defer {
        print("Defer 1")
    }

    defer {
        print("Defer 2")
    }

    defer {
        print("Defer 3")
    }
    
    print("Statement 2")
}

testFunction3()

実行結果は次のようになります。

Statement 1
Statement 2
Defer 3
Defer 2
Defer 1

Swift の defer 文 3

Defer 文が 3 -> 2 -> 1 の順番で実行されていますね。


do 文と合わせて defer 文を使う

do 文と合わせて使うことでスコープを作って、do 文のスコープを抜ける時に defer 文を実行することもできます。

func testFunction4() {
    
    print("Statement 1")
    
    do {
        print("Statement 2")
        defer {
            print("Defer 1")
        }
        print("Statement 3")
    }
    
    print("Statement 4")
}

testFunction4()

実行結果は次のようになります。

Statement 1
Statement 2
Statement 3
Defer 1
Statement 4

Swift の defer 文 4

Statement 1 の print 文が実行され、do 文内 print 文が Statement 2 -> Statement 3 -> Defer 1 の順番で実行されて、その後、外のスコープの Statement 4 の print 文が実行されています。


以上、Swift の defer 文 についてご説明しました。

© 2024 iOS 開発入門