SwiftのdeferとJavaのfinally

Swift defer

・現在のスコープ(関数・メソッド・ブロック)を抜ける直前に必ず実行される。
・正常終了でも、return でも、エラー throw でも必ず実行される。
・追加した順ではなく 後入れ先出し(LIFO) で実行。

func example() {
    defer { print("A") }
    defer { print("B") }
    print("Work")
}

 

Work
B
A

Java finally

・try / catch の終了後、必ず実行されるブロック。
・例外が発生しても、return しても実行される。
・try-catch-finally の文脈の中でのみ使用可能。

try {
    System.out.println("Work");
} finally {
    System.out.println("Cleanup");
}

比較

 

特徴

Swift defer

Java finally

実行タイミング

スコープ終了時

try/catch が終わった後

使用場所

どこでも使える

try/catch の内部

実行順

後入れ先出し (LIFO)

定義順に実行

主な用途

クリーンアップ、早期 return 対応

クリーンアップ(古典的手法)

仕組み

コンパイラによるスコープ管理

構文的ブロックに基づく制御

Java,SwiftJava,Swift

Posted by shi-n