0Pricing
Swift Academy · レッスン

deferの仕組み

どの経路でもスコープ終了時にコードを実行します。

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

defer の動作

defer ブロックは、現在のスコープをどのように終了する場合でも、スコープを抜ける直前にコードを実行するよう予約します。

func demo() {
    defer { print("cleanup") }
    print("work")
}
demo()

スコープの終了時に実行される

defer されたコードは、スコープ内の残りの処理が終わった後、制御がスコープを抜ける直前に実行されます。

func greet() {
    defer { print("goodbye") }
    print("hello")
}
greet()

通常の流れの後に defer する

文が複数ある場合でも、defer の本体は最後に実行されます。

func process() {
    defer { print("3 deferred") }
    print("1 start")
    print("2 middle")
}
process()

ループ内のdefer

ループ本体内のdeferは、各反復の終了時に実行されます。

for i in 1...3 {
    defer { print("end of iteration", i) }
    print("start of iteration", i)
}

if内のdefer

スコープは任意のブロックにできます。if内のdeferは、そのifブロックが終了するときに実行されます。

func check(_ flag: Bool) {
    if flag {
        defer { print("leaving if block") }
        print("inside if")
    }
    print("after if")
}
check(true)

現在の値のキャプチャ

deferブロックは変数を参照でキャプチャするため、実行された時点の値を参照します。

func counterDemo() {
    var count = 0
    defer { print("final count:", count) }
    count = 5
}
counterDemo()

deferは処理を遅延させない

deferは非同期には実行されません。スコープを抜けるときに同期的に実行され、関数が呼び出し元に戻る前に完了します。

func order() {
    defer { print("B") }
    print("A")
}
order()
print("C")

よくある用途:セットアップと後処理の対応付け

後処理をセットアップのすぐ隣に記述すると、両者を見た目の上でも論理的にも対応付けておけます。

func session() {
    print("open session")
    defer { print("close session") }
    print("do work")
}
session()

doブロック内のdefer

doブロック内のdeferは、そのブロックを抜けるときに実行されます。

func run() {
    do {
        defer { print("do block cleanup") }
        print("inside do")
    }
    print("after do")
}
run()

defer内の複数の文

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

func multi() {
    defer {
        print("step 1 of cleanup")
        print("step 2 of cleanup")
    }
    print("main work")
}
multi()

deferを使う理由

deferを使うと、スコープがどのように終了しても後処理が必ず実行されるため、経路によって後処理を忘れる可能性を減らせます。

func guaranteed() {
    defer { print("always runs") }
    print("body")
}
guaranteed()

確認問題

deferの実行タイミングを確認します。

まとめ

deferは、スコープがどのように終了しても、現在のスコープの最後にコードを実行するようスケジュールします。同期的に実行され、スコープ内では最後に実行されるため、後処理をセットアップの近くに置くのに適しています。

func demo() {
    defer { print("last") }
    print("first")
}
demo()

よくある質問

「deferの仕組み」レッスンは無料ですか?

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

「deferの仕組み」で何を学びますか?

どの経路でもスコープ終了時にコードを実行します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「deferの仕組み」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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