0Pricing
Swift Academy · レッスン

複数のdeferブロックの実行順序

deferが逆順に実行される仕組みを理解します。

「複数のdeferブロックの実行順序」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

複数のdefer

1つのスコープには複数のdeferブロックを含められます。それらはすべてスコープを抜けるときに実行されます。

func demo() {
    defer { print("A") }
    defer { print("B") }
    print("body")
}
demo()

逆順(LIFO)での実行

deferブロックは宣言された順序の逆順に実行されます。最後に宣言したものが最初に実行されます。

func order() {
    defer { print("1") }
    defer { print("2") }
    defer { print("3") }
    print("start")
}
order()

LIFOで実行する理由

LIFOの順序は、セットアップと後処理が入れ子になる構造を反映しています。最後に行ったセットアップが最初に取り消されます。

func resources() {
    print("open A")
    defer { print("close A") }
    print("open B")
    defer { print("close B") }
    print("use both")
}
resources()

スタックのメンタルモデル

deferをスタックとして考えてみましょう。それぞれがタスクを1つ積み上げ、スコープが終了すると逆順に取り出されます。

func stack() {
    defer { print("pop first-declared last") }
    defer { print("pop last-declared first") }
    print("push done")
}
stack()

deferとローカル状態

各deferは周囲の変数をキャプチャし、実行時にはそれらの最終的な値を参照します。

func state() {
    var x = 1
    defer { print("x is", x) }
    x = 42
}
state()

ループ内のdefer

ループ内では、各反復がそれぞれのdeferを登録し、その反復の終了時にLIFO順で実行します。

for i in 1...2 {
    defer { print("late", i) }
    defer { print("early", i) }
    print("body", i)
}

ネストしたスコープ

deferは自身のスコープを抜けるときに実行されるため、内側のブロックのdeferが外側のブロックのdeferより先に実行されます。

func nested() {
    defer { print("outer defer") }
    do {
        defer { print("inner defer") }
        print("inner body")
    }
    print("outer body")
}
nested()

予測可能な後処理

LIFO順にすると、対応する開く処理と閉じる処理の組み合わせが自然に正しい順序で閉じられます。

func files() {
    print("open log")
    defer { print("flush log") }
    print("open db")
    defer { print("disconnect db") }
    print("transaction")
}
files()

実行順序の読み取り方

出力を予測するには、deferを下から上へ読みます。スコープ内で最後に記述されたdeferが最初に出力します。

func quiz() {
    defer { print("one") }
    defer { print("two") }
    print("body runs first")
}
quiz()

returnとの組み合わせ

関数が早期に戻る場合でも、登録されたdeferはすべてLIFO順で実行されます。

func early(_ skip: Bool) {
    defer { print("cleanup 1") }
    defer { print("cleanup 2") }
    if skip { return }
    print("full body")
}
early(true)

ベストプラクティス

各後処理を対応するセットアップの直後に宣言し、LIFO順によって正しく巻き戻されるようにします。

func pattern() {
    print("acquire 1")
    defer { print("release 1") }
    print("acquire 2")
    defer { print("release 2") }
    print("work")
}
pattern()

確認問題

deferの実行順序を確認します。

まとめ

複数のdeferブロックは、スコープを抜けるときに逆順(LIFO順)で実行されます。最後に宣言したものが最初に実行されます。これにより、早期に戻る場合でも、入れ子になったセットアップと後処理の組み合わせが自然に正しい順序で巻き戻されます。

func demo() {
    defer { print("1") }
    defer { print("2") }
    print("body")
}
demo()

よくある質問

「複数のdeferブロックの実行順序」レッスンは無料ですか?

はい。「複数のdeferブロックの実行順序」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「複数のdeferブロックの実行順序」で何を学びますか?

deferが逆順に実行される仕組みを理解します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「複数のdeferブロックの実行順序」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. deferの仕組み
  2. 複数のdeferブロックの実行順序
  3. リソース解放のためのdefer
  4. エラーと早期リターンでのdefer
← Swift Academyに戻る