0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift】defer構文による実行の遅延

Last updated at Posted at 2025-02-04

この記事は何

Swift Dcumentationより、deferステートメントを解説する。

Swiftを基礎から学ぶには
自著、工学社より発売中の「まるごと分かるSwiftプログラミング」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「今日からはじめるプログラミング」をお勧めします。

遅延ブロックを作成する

コードが実行されるかどうかを制御するifや実行の回数を制御するwhileなどのフロー制御構文とは異なり、deferステートメントはコードの実行を遅延します。
作成した遅延ブロックのコードは、プログラムが現在のスコープを終了したときに実行されます。

defer構文は実行を遅延する
var score = 1

if score < 10 {
    defer { print(score) }  // スコープ終了の直前に実行される
    score += 5
}
// Prints "6"

この例では、ifステートメントのボディを終了する直前に、deferブロックのコードが実行されます。
まず、ifステートメントのコードが実行されて、スコアに5を加算します。
そして、ifステートメントのスコープを終了する直前に遅延ブロックが実行されて、スコアを出力します。

遅延ブロックの利点

プログラムがそのスコープをどのように終了(例えば、関数からの早期終了、breakによるforループからの脱出、エラーのスローなど)しても、deferブロックは実行されます。
この仕組みは、deferは開始と終了のペア・アクション(例えば、手動でのメモリ割り当てと解放、低レベルなファイル記述子による開閉、データベース・トランザクションの開始と終了など)が発生することを保証する必要がある操作で役立ちます。
開始と終了の両アクションを並べてコーディングできるからです。
次のコードは、コードのチャンク内で100を加算および減算することで、スコアに一時的なボーナスを与えます。

加算と減算のペア・アクション
var score = 3

// スコアが100未満なら、一時的なボーナスを加算
if score < 100 {
    score += 100            // ボーナスを加算したら...
    defer { score -= 100 }  // 直後で、忘れずに減算を遅延しておく

    /* 以降の行では、ボーナスが加算されている */ 
    print(score)
}
/* ボーナスは解除されている */ 
print("Out of bonus; \(score)")

// Prints "103"
// Prints "Out of bonus; 3"

遅延ブロックの実行される順番

同じスコープに複数の遅延ブロックがある場合、先のブロックの方が後に実行されます。

遅延ブロックが複数あるコード
var score = 1

if score < 10 {
    defer { print(score) }            // 最初のdeferブロックは最後に実行される
    defer { print("The score is:") }  // 先に実行されるdeferブロック
    score += 5
}
// Prints "The score is:"
// Prints "6"

ランタイムエラーやクラッシュなどによってプログラムが停止した場合、遅延コードは実行されません。
ただし、遅延コードはエラーがスローされると実行されます。
エラー処理で遅延を使用する方法については、「クリーンアップアクションの指定」を参照してください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?