カテゴリ: Swift 更新日: 2025/12/19

Swiftのdefer文の使い方とリソース解放のベストプラクティス|初心者向け解説

Swift defer文の使い方とリソース解放のベストプラクティス
Swift defer文の使い方とリソース解放のベストプラクティス

先生と生徒の会話形式で理解しよう

生徒

「Swiftで何か片付ける処理ってどう書けばいいんですか?ファイルを閉じるとか…」

先生

「そういうときはdeferという構文を使うと便利ですよ。処理の終わりに必ず実行したいときに使います。」

生徒

「それって必ず実行されるんですか?途中でエラーとかあっても?」

先生

「はい。Swiftのdeferは、関数を抜けるときに必ず呼ばれる構文なんです。それでは、使い方を見ていきましょう!」

1. Swiftのdefer文とは?

1. Swiftのdefer文とは?
1. Swiftのdefer文とは?

defer文とは、関数やスコープ(囲まれた範囲)から抜けるときに必ず実行される処理を定義するための構文です。リソースの解放(たとえばファイルを閉じたり、データベースの接続を切ったり)に最適です。

「後でやっておくよ」という意味合いで使われ、読みやすく、バグを防ぎやすくなります。

2. deferの基本的な使い方

2. deferの基本的な使い方
2. deferの基本的な使い方

まずはdeferの基本形を見てみましょう。関数の中でdeferブロックを使うと、その関数の処理が終わる直前に実行されます。


func sampleFunction() {
    print("処理開始")
    defer {
        print("後片付け中")
    }
    print("メイン処理中")
}
sampleFunction()

処理開始
メイン処理中
後片付け中

このように、関数の中でdeferが後に書かれていても、最後に実行されます。

3. deferは複数書いても大丈夫?

3. deferは複数書いても大丈夫?
3. deferは複数書いても大丈夫?

defer文は、ひとつの関数の中に複数書くことができます。ですが、実行される順番は後に書いたdeferが先に実行されます。


func multiDefer() {
    defer { print("最後のdefer") }
    defer { print("最初のdefer") }
    print("処理中")
}
multiDefer()

処理中
最初のdefer
最後のdefer

このように、スタック(積み重ね)構造で動作します。初心者の方は、「あとから書いたほうが先に実行される」と覚えておくとよいでしょう。

Swiftを基礎から実践レベルまで学びたい人や、 iOSアプリ開発を本格的に始めたい人には、 定番の入門+実践書がこちらです。

Swift実践入門をAmazonで見る

※ Amazon広告リンク

4. deferの活用例:ファイル操作

4. deferの活用例:ファイル操作
4. deferの活用例:ファイル操作

たとえば、ファイルを開いて中身を読み取ったあと、忘れずに閉じたいときにdeferが大活躍します。

実際のiOSアプリなどでも、こうしたリソースの解放は非常に重要です。


func readFile() {
    let file = "example.txt"
    print("ファイルを開く: \(file)")

    defer {
        print("ファイルを閉じる")
    }

    print("ファイルを読み込み中...")
}
readFile()

ファイルを開く: example.txt
ファイルを読み込み中...
ファイルを閉じる

このように、読み込みが終わったあとで確実に「閉じる」処理が実行されます。たとえ途中でエラーがあってもdeferは実行されるので、安全です。

5. deferが便利な場面とは?

5. deferが便利な場面とは?
5. deferが便利な場面とは?

deferは以下のような場面で非常に便利です。

  • ファイルのオープンとクローズ
  • データベース接続の開始と終了
  • 一時的に使った変数や状態を元に戻す
  • ログを取る(開始・終了のタイミング)

こうした処理をdeferにまとめておけば、「やり忘れ」を防げます。

6. deferを使うときの注意点

6. deferを使うときの注意点
6. deferを使うときの注意点

便利なdeferですが、次の点には注意しましょう。

  • 処理の順番を間違えると意図しない結果になる
  • パフォーマンスへの影響があるような重たい処理をdeferに入れすぎない
  • スコープ({}で囲まれた範囲)を抜けるときにしか実行されないこと

特に初心者は、「deferはスコープを出るときに実行される」という基本ルールを覚えておくと安心です。

7. deferの中で値を変更できる?

7. deferの中で値を変更できる?
7. deferの中で値を変更できる?

defer文の中でも、変数の値を変更することはできます。ただし、変更が有効になるのはdeferが実行された後です。


func deferChange() {
    var result = "初期値"
    defer {
        result = "変更後"
        print("defer内: \(result)")
    }
    print("処理中: \(result)")
}
deferChange()

処理中: 初期値
defer内: 変更後

このように、変更後の値は関数を抜けるタイミングで反映されます。

8. deferのベストプラクティス

8. deferのベストプラクティス
8. deferのベストプラクティス

deferを効果的に使うためには、次のポイントを意識しましょう。

  • 関数の先頭でdeferを書くようにする(書き忘れ防止)
  • コメントをつけて、何のためのdeferか分かるようにする
  • 処理が重くなる内容は避け、短く完結にする

特にSwiftでのアプリ開発では、メモリリーク(使い終わったデータが残り続けること)を防ぐためにdeferはとても大切です。

まとめ

まとめ
まとめ

Swiftでの開発において、defer文はとても重要な役割を持つ構文であり、関数やスコープから抜けるときに必ず実行される処理を書くことで、リソース解放や後片付けの作業を安全に行える点が大きな特徴です。この記事全体を振り返ると、defer文はファイル処理やデータベース接続の終了といった場面だけでなく、ログ管理や一時的な状態を元に戻す操作など、幅広い領域で役立つことが分かりました。特に初心者の方がつまずきやすい「処理の順番」については、あとから書いたdeferが先に実行されるというスタックの仕組みを理解することで、複数のdeferを適切に扱えるようになります。 また、関数の先頭でdeferを書く習慣をつければ、処理の中で書き忘れが起きにくくなり、Swiftのコード全体がより安定したものになります。リソース解放はアプリ開発では避けて通れない要素であり、例えばファイルを開く処理やネットワーク接続の開始など、インターフェースを扱う操作では必ず終わりの処理が必要です。deferを使ってまとめて記述することで、読みやすいコードを維持しながら安全性が高い処理が行える点は、Swiftの強みでもあります。 さらに、defer内で値を変更できることや、スコープを抜けるタイミングで実行される点など、開発中に役立つ細かいポイントも多くありました。以下では、今回のまとめとして簡単なサンプルコードも再掲し、学んだ内容を確認しながら理解を深められるようにしています。こうした振り返りを重ねていくことで、Swiftの構文やリソース管理が自然に身についていき、アプリ開発がよりスムーズに進むようになります。

サンプルプログラム(復習用)


func cleanupSample() {
    print("処理開始")

    defer {
        print("後始末の処理を実行")
    }

    print("メイン処理中…重要なロジックを実行中")
}

cleanupSample()

このサンプルのように、defer文を適切に使うことで、途中でエラーが発生したとしても後片付けが確実に実行されます。こうした仕組みはアプリの安定性に直結し、開発者にとって大きなメリットとなります。ファイルのクローズ、接続の終了、メモリ管理など、アプリ開発では慎重な処理が求められる場面が多く、deferはまさにそうした場面を支えてくれる重要な構文です。 また、コードを見返したときに「このdeferは何のためにあるのか」がすぐに分かるよう、コメントを付ける習慣を持つことで読みやすさも向上します。複数の処理が絡む関数では特に、リソース解放の順序や実行タイミングを把握することが重要であり、deferを活用することでトラブルやバグを防ぎやすくなります。 Swiftの開発環境では、UIの更新、ネットワーク通信、データ書き込みなどさまざまな処理が日々行われますが、どの場面でも「最後に必ず実行したい処理」は存在します。これを適切に管理できるようになれば、プログラム全体の品質が高まり、後から機能追加や修正を行う際にも負担が少なくなります。初心者のうちからdefer文に慣れておくことは非常に良い習慣であり、実務でもしっかり役立つ知識になります。

先生と生徒の振り返り会話

生徒:「先生、deferを使うとファイルを閉じ忘れたりしなくなるって本当ですね。実際に使ってみると便利でした。」

先生:「そうですね。Swiftのdeferは、処理が終わるときに必ず実行されるので、安全に後片付けができます。アプリ開発では欠かせない仕組みですよ。」

生徒:「複数書いたときにあとから書いたほうが先に実行されるっていうのも意外でした。スタックの仕組みなんですよね?」

先生:「そのとおりです。順番を意識しないと意図しない挙動になるので注意が必要ですが、理解してしまえばとても扱いやすい構文ですよ。」

生徒:「他にもデータベース接続とか状態の戻しとか、いろいろな用途があるのが分かりました。アプリ開発でも役立ちそうですね。」

先生:「ええ、必ず実行したい処理をまとめて書けるので、読みやすいコードを書くためにも非常に有効です。これからも積極的に使ってみてください。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Swiftのdefer文とはどんな構文で、何のために使うのですか?

Swiftのdefer文は、関数やスコープから抜ける際に必ず実行される処理を書くための構文です。ファイルを閉じる、データベース接続を終了するなど、リソースの解放処理に最適です。
カテゴリの一覧へ
新着記事
New1
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New2
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
New3
Swift
Swiftでエラー原因を可視化!ログとトレースのベストプラクティスを初心者向けに解説
New4
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.8
Java&Spring記事人気No8
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク