Swift deferの正しい使い方|リソース解放と後片付けを初心者向けに徹底解説
生徒
「先生、Swiftでdeferっていうキーワードを見たんですけど、どういうときに使うんですか?」
先生
「いい質問ですね。deferは、プログラムの処理が終わったあとに必ず実行してほしい処理をまとめて書くための仕組みなんです。例えば、ファイルを閉じたりメモリを解放したりといった“後片付け”に使われます。」
生徒
「なるほど、片付けを忘れないようにするための仕組みなんですね。具体的にどんな感じで書くんですか?」
先生
「それでは実際の使い方を一緒に見ていきましょう!」
1. Swiftのdeferとは?
deferは、Swiftで用意されている特別なキーワードで、処理が終了するときに必ず実行されるブロックを定義します。プログラミングの世界では「リソースの解放」や「後片付け」と呼ばれる作業が重要で、これを忘れるとエラーやメモリ不足の原因になります。
例えば、机で作業したあとに必ず片付けをするように、プログラムも使ったファイルやネットワーク接続を閉じる必要があります。このときに便利なのがdeferです。
2. deferの基本的な使い方
deferは、書かれた位置に関係なく、スコープ(波括弧 { } の中)の処理が終わる直前に実行されます。実際にコードで確認してみましょう。
func sampleFunction() {
print("処理開始")
defer {
print("後片付け処理")
}
print("メインの処理中")
}
sampleFunction()
このコードを実行すると、出力結果は次のようになります。
処理開始
メインの処理中
後片付け処理
このように、deferで書いた内容は、関数の処理が終わる直前に必ず呼ばれます。
3. 複数のdeferがある場合
もしdeferを複数書いた場合は、最後に書いたものから順番に実行されます。これは「後入れ先出し(LIFO)」と呼ばれるルールです。
func multipleDefer() {
defer { print("1番目の後片付け") }
defer { print("2番目の後片付け") }
defer { print("3番目の後片付け") }
print("メインの処理実行中")
}
multipleDefer()
実行結果は次の通りです。
メインの処理実行中
3番目の後片付け
2番目の後片付け
1番目の後片付け
このように、最後に宣言したdeferから順番に実行されます。
4. ファイル操作でのdefer活用
deferは特に「リソース解放」に役立ちます。例えば、ファイルを開いたら必ず閉じる必要があります。閉じ忘れるとファイルがロックされたままになり、他の処理ができなくなることもあります。
func readFile() {
let file = "sample.txt"
print("\(file) を開きました")
defer {
print("\(file) を閉じました")
}
print("ファイルの内容を読み込んでいます...")
}
readFile()
このように、ファイル操作の最後に必ず実行したい処理をdeferに書いておけば、うっかり閉じ忘れる心配がなくなります。
5. ネットワークやメモリ解放でも役立つ
deferはファイル操作だけでなく、ネットワーク接続を切断する処理や、一時的に確保したメモリを解放する処理などにも使えます。
例えば、インターネットに接続してサーバーからデータを取得するプログラムを書くとき、接続を閉じるのを忘れると通信が無駄に残ってしまいます。しかし、deferを使えば確実に切断処理を実行できます。
このようにdeferは、プログラミングで避けられない「片付け」を忘れないための保険のような存在です。
6. エラー処理とdeferの関係
Swiftでは、エラーが発生すると処理の途中で関数を抜けてしまうことがあります。こうしたときもdeferに書いた処理は必ず実行されます。
enum SampleError: Error {
case somethingWrong
}
func errorHandlingExample() throws {
print("処理開始")
defer {
print("必ず実行される後片付け")
}
throw SampleError.somethingWrong
}
do {
try errorHandlingExample()
} catch {
print("エラーが発生しました: \(error)")
}
実行すると、エラーで処理が中断されてもdeferの内容はしっかり実行されます。これにより、プログラムが異常終了してもリソースを安全に解放できるのです。
7. deferを使うときの注意点
deferは便利ですが、使いすぎるとコードが読みにくくなることもあります。特に複数のdeferを重ねすぎると、実行順序を理解しづらくなります。
また、deferの中で時間がかかる処理をすると、関数の終了が遅れる原因にもなるため注意が必要です。基本的には「片付け」や「解放」のように短い処理だけを書くのがおすすめです。