【Swift】deferステートメントの使い方!スコープを抜ける際に処理を実行

【Swift】deferステートメントの使い方!スコープを抜ける際に処理を実行

この記事からわかること

  • Swiftdeferステートメント使い方
  • スコープ抜ける際に処理実行する方法
  • 定義タイミング変数参照

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

deferステートメントとは?

Swiftの構文の1つであるdeferステートメントはスコープを抜ける際に実行されるコードブロックを定義できる構文です。

defer { 
  // スコープを抜けた際に実行したい処理
}

スコープとはコード内の特定の部分で変数や定数がアクセス可能な範囲を指します。スコープ内の変数や定数は、そのスコープ内でのみ有効であり、外部からアクセスすることはできません。例えば関数はその処理が終了するとスコープが閉じられるのでその関数内で定義した変数などはその中でしか使用することはできません。

deferの挙動を確かめるために以下の関数を実行してみます。

func debugPrint() {
    print("1")
    defer {
        print("end")
    }
    print("2")
    print("3")
}

debugPrint()

出力されるのは以下の通りになります。

1
2
3
end

また複数のdeferを定義することもでき、その実行タイミングは定義した順番とは逆になります。

func debugPrint() {
    print("1")
    defer {
        print("end")
    }
    print("2")
    defer {
        print("end2")
    }
    print("3")
}
1
2
3
end2
end

deferの定義タイミング

deferをスコープ内に定義する場所はエラーの発生やreturn、breakなどスコープが終了する箇所の後に設置した場合は動作しません。

do {
    defer { print("処理1") }
    try conversionNum(numStr: "11")
    defer { print("処理2") }
} catch {
    print("エラー発生")
}
エラーなし:処理2→処理1
エラー発生:処理1

変数の参照

defer内ではスコープの変数を参照することができますが、その値はスコープを抜けた時に保持している値になります。

func debugPrint() {
    var value = 1
    print("Start:\(value)")
    
    defer {
        print("defer: \(value)")
    }
    
    value = 2
    print("End:\(value)")
}
Start:1
End:2
defer: 2

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index