Swiftのdefer文の使い方とリソース解放のベストプラクティス|初心者向け解説
生徒
「Swiftで何か片付ける処理ってどう書けばいいんですか?ファイルを閉じるとか…」
先生
「そういうときはdeferという構文を使うと便利ですよ。処理の終わりに必ず実行したいときに使います。」
生徒
「それって必ず実行されるんですか?途中でエラーとかあっても?」
先生
「はい。Swiftのdeferは、関数を抜けるときに必ず呼ばれる構文なんです。それでは、使い方を見ていきましょう!」
1. Swiftのdefer文とは?
defer文とは、関数やスコープ(囲まれた範囲)から抜けるときに必ず実行される処理を定義するための構文です。リソースの解放(たとえばファイルを閉じたり、データベースの接続を切ったり)に最適です。
「後でやっておくよ」という意味合いで使われ、読みやすく、バグを防ぎやすくなります。
2. deferの基本的な使い方
まずはdeferの基本形を見てみましょう。関数の中でdeferブロックを使うと、その関数の処理が終わる直前に実行されます。
func sampleFunction() {
print("処理開始")
defer {
print("後片付け中")
}
print("メイン処理中")
}
sampleFunction()
処理開始
メイン処理中
後片付け中
このように、関数の中でdeferが後に書かれていても、最後に実行されます。
3. deferは複数書いても大丈夫?
defer文は、ひとつの関数の中に複数書くことができます。ですが、実行される順番は後に書いたdeferが先に実行されます。
func multiDefer() {
defer { print("最後のdefer") }
defer { print("最初のdefer") }
print("処理中")
}
multiDefer()
処理中
最初のdefer
最後のdefer
このように、スタック(積み重ね)構造で動作します。初心者の方は、「あとから書いたほうが先に実行される」と覚えておくとよいでしょう。
4. deferの活用例:ファイル操作
たとえば、ファイルを開いて中身を読み取ったあと、忘れずに閉じたいときにdeferが大活躍します。
実際のiOSアプリなどでも、こうしたリソースの解放は非常に重要です。
func readFile() {
let file = "example.txt"
print("ファイルを開く: \(file)")
defer {
print("ファイルを閉じる")
}
print("ファイルを読み込み中...")
}
readFile()
ファイルを開く: example.txt
ファイルを読み込み中...
ファイルを閉じる
このように、読み込みが終わったあとで確実に「閉じる」処理が実行されます。たとえ途中でエラーがあってもdeferは実行されるので、安全です。
5. deferが便利な場面とは?
deferは以下のような場面で非常に便利です。
- ファイルのオープンとクローズ
- データベース接続の開始と終了
- 一時的に使った変数や状態を元に戻す
- ログを取る(開始・終了のタイミング)
こうした処理をdeferにまとめておけば、「やり忘れ」を防げます。
6. deferを使うときの注意点
便利なdeferですが、次の点には注意しましょう。
- 処理の順番を間違えると意図しない結果になる
- パフォーマンスへの影響があるような重たい処理を
deferに入れすぎない - スコープ({}で囲まれた範囲)を抜けるときにしか実行されないこと
特に初心者は、「deferはスコープを出るときに実行される」という基本ルールを覚えておくと安心です。
7. deferの中で値を変更できる?
defer文の中でも、変数の値を変更することはできます。ただし、変更が有効になるのはdeferが実行された後です。
func deferChange() {
var result = "初期値"
defer {
result = "変更後"
print("defer内: \(result)")
}
print("処理中: \(result)")
}
deferChange()
処理中: 初期値
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は、処理が終わるときに必ず実行されるので、安全に後片付けができます。アプリ開発では欠かせない仕組みですよ。」
生徒:「複数書いたときにあとから書いたほうが先に実行されるっていうのも意外でした。スタックの仕組みなんですよね?」
先生:「そのとおりです。順番を意識しないと意図しない挙動になるので注意が必要ですが、理解してしまえばとても扱いやすい構文ですよ。」
生徒:「他にもデータベース接続とか状態の戻しとか、いろいろな用途があるのが分かりました。アプリ開発でも役立ちそうですね。」
先生:「ええ、必ず実行したい処理をまとめて書けるので、読みやすいコードを書くためにも非常に有効です。これからも積極的に使ってみてください。」