Swift deferの正しい使い方|リソース解放と後片付けを初心者向けに徹底解説
生徒
「先生、Swiftでdeferっていうキーワードを見たんですけど、どういうときに使うんですか?」
先生
「いい質問ですね。deferは、プログラムの処理が終わったあとに必ず実行してほしい処理をまとめて書くための仕組みなんです。例えば、ファイルを閉じたりメモリを解放したりといった“後片付け”に使われます。」
生徒
「なるほど、片付けを忘れないようにするための仕組みなんですね。具体的にどんな感じで書くんですか?」
先生
「それでは実際の使い方を一緒に見ていきましょう!」
1. Swiftのdeferとは?
deferは、Swiftに用意されているキーワードで、「この処理が終わるときに、必ずこれを実行してほしい」という後片付け専用の処理を書ける仕組みです。ポイントは、途中でreturnしたり、エラーが発生しても必ず実行されるところにあります。プログラムでは、使い終わったファイルや通信、仮のデータなどをきちんと片付けないと、動作不良やメモリ不足の原因になります。
日常生活にたとえると、「作業の途中で電話が来て席を立っても、最後には必ず机を片付ける」と決めておくようなものです。deferを使えば、処理の流れを意識しなくても、後片付けを自動で任せられます。
func simpleDeferExample() {
print("処理スタート")
defer {
print("必ず実行される後片付け")
}
print("途中の処理")
}
simpleDeferExample()
このサンプルでは、deferの中に書いた処理が、関数の最後に必ず実行されます。書いた位置に関係なく、スコープ({ })を抜ける直前に動くのが特徴です。初心者のうちは「最後に必ず動く予約処理」と覚えておくと、deferの役割をイメージしやすくなります。
2. deferの基本的な使い方
deferの基本ルールはシンプルで、同じスコープ(波括弧 { } の中)を抜ける直前に実行されるというものです。「deferを書いた場所」ではなく、「スコープが終わるタイミング」で動くのがポイントです。だから、途中で処理が終わっても(returnで抜けても)後片付けだけは最後に必ず走ります。
まずは、関数の中でdeferがどう動くかを見てみましょう。下のコードでは、メインの処理が終わったあとにdeferの中身が実行されます。
func sampleFunction() {
print("処理開始")
defer {
print("後片付け処理")
}
print("メインの処理中")
}
sampleFunction()
このコードを実行すると、出力結果は次のようになります。
処理開始
メインの処理中
後片付け処理
「最後に出るのがdefer」と覚えると分かりやすいです。もう少しイメージを強くするために、途中でreturnする例も見てみます。returnで早めに関数を終えても、deferはスキップされません。
func earlyReturnExample(isOK: Bool) {
print("チェック開始")
defer {
print("必ず実行される後片付け")
}
if !isOK {
print("条件に合わないので終了")
return
}
print("条件に合ったので続行")
}
earlyReturnExample(isOK: false)
このように、deferは「最後に必ず実行したい処理」を1か所にまとめられるので、片付け忘れを防ぎやすくなります。初心者のうちは、“スコープ終了の直前に動く予約”と捉えると理解しやすいです。
3. 複数のdeferがある場合
deferは1つの関数やスコープの中に、いくつでも書くことができます。このときに覚えておきたいのが、実行される順番です。複数のdeferがある場合は、「最後に書いたものから先に実行される」というルールになっています。これはスタック構造と同じで、「後入れ先出し(LIFO)」と呼ばれます。
初心者の方は、「後から予約した片付けほど、先に片付けられる」と考えるとイメージしやすいです。処理の流れとは逆順になるので、順番を意識せずに書くと混乱しやすいポイントでもあります。
func multipleDefer() {
defer { print("1番目の後片付け") }
defer { print("2番目の後片付け") }
defer { print("3番目の後片付け") }
print("メインの処理実行中")
}
multipleDefer()
このコードの実行結果は次のようになります。
メインの処理実行中
3番目の後片付け
2番目の後片付け
1番目の後片付け
一番最後に書いたdeferが、スコープ終了時に最初に呼ばれているのが分かります。複数のリソースを扱う処理では、「開いた順とは逆に閉じる」必要があることが多いため、この挙動はとても理にかなっています。複数の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の中で時間がかかる処理をすると、関数の終了が遅れる原因にもなるため注意が必要です。基本的には「片付け」や「解放」のように短い処理だけを書くのがおすすめです。
Windowsで始めるiPhoneアプリ開発入門|Swiftの基本と仕組みを1時間で攻略
Windowsで始めるiPhoneアプリ開発入門|Swiftの基本と仕組みを1時間で攻略
「iPhoneアプリを作りたいけれど、Macを持っていないから諦めている」そんな方のための画期的な入門講座です。実は、プログラミングの本質を学ぶのに高価な機材は必要ありません。本講座では、Windowsパソコンを使用し、クラウド環境を活用してAppleの最新言語Swift(スウィフト)の基礎を最短距離でマスターします。
Windowsで実現する開発環境
【つくるもの】
ブラウザ上で動作する「スマート・計算ツール」や「データ判定プログラム」をゼロから作成します。変数の扱いや条件分岐など、iPhoneアプリの内部で動くロジックを自分の手で構築する感動を体験してください。
【開発環境】
ブラウザだけでSwiftが動くプロ仕様のオンラインエディタ(Replit等)を使用します。面倒な設定は一切不要。今あるWindows PCで、プロのエンジニアと同じコードを書き始められます。
この60分で得られる3つの理解
OSの壁を越え、クラウドを活用してスマートに学習を開始する「現代的な開発スタイル」を習得します。
iPhoneアプリ特有のデータの扱い方や、Appleが推奨する「安全で美しいコード」の書き方を学びます。
将来的にiOSエンジニアとして副業・転職するために必要な準備や、Mac選びのポイントを伝授します。
※本講座は、将来的にiPhoneアプリ開発で収益化や転職を目指したい未経験者のためのエントリー講座です。マンツーマン形式により、Windows環境ならではの疑問にもその場でお答えし、あなたの理解度に合わせて進行します。
Windowsで始めるiPhoneアプリ開発入門