カテゴリ: Swift 更新日: 2025/11/18

Swift deferの正しい使い方|リソース解放と後片付けを初心者向けに徹底解説

Swift deferの正しい使い方|リソース解放と後片付け
Swift deferの正しい使い方|リソース解放と後片付け

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

生徒

「先生、Swiftでdeferっていうキーワードを見たんですけど、どういうときに使うんですか?」

先生

「いい質問ですね。deferは、プログラムの処理が終わったあとに必ず実行してほしい処理をまとめて書くための仕組みなんです。例えば、ファイルを閉じたりメモリを解放したりといった“後片付け”に使われます。」

生徒

「なるほど、片付けを忘れないようにするための仕組みなんですね。具体的にどんな感じで書くんですか?」

先生

「それでは実際の使い方を一緒に見ていきましょう!」

1. Swiftのdeferとは?

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

deferは、Swiftで用意されている特別なキーワードで、処理が終了するときに必ず実行されるブロックを定義します。プログラミングの世界では「リソースの解放」や「後片付け」と呼ばれる作業が重要で、これを忘れるとエラーやメモリ不足の原因になります。

例えば、机で作業したあとに必ず片付けをするように、プログラムも使ったファイルやネットワーク接続を閉じる必要があります。このときに便利なのがdeferです。

2. deferの基本的な使い方

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

deferは、書かれた位置に関係なく、スコープ(波括弧 { } の中)の処理が終わる直前に実行されます。実際にコードで確認してみましょう。


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

    defer {
        print("後片付け処理")
    }

    print("メインの処理中")
}
sampleFunction()

このコードを実行すると、出力結果は次のようになります。


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

このように、deferで書いた内容は、関数の処理が終わる直前に必ず呼ばれます。

3. 複数のdeferがある場合

3. 複数のdeferがある場合
3. 複数のdeferがある場合

もしdeferを複数書いた場合は、最後に書いたものから順番に実行されます。これは「後入れ先出し(LIFO)」と呼ばれるルールです。


func multipleDefer() {
    defer { print("1番目の後片付け") }
    defer { print("2番目の後片付け") }
    defer { print("3番目の後片付け") }

    print("メインの処理実行中")
}
multipleDefer()

実行結果は次の通りです。


メインの処理実行中
3番目の後片付け
2番目の後片付け
1番目の後片付け

このように、最後に宣言したdeferから順番に実行されます。

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

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

deferは特に「リソース解放」に役立ちます。例えば、ファイルを開いたら必ず閉じる必要があります。閉じ忘れるとファイルがロックされたままになり、他の処理ができなくなることもあります。


func readFile() {
    let file = "sample.txt"
    print("\(file) を開きました")

    defer {
        print("\(file) を閉じました")
    }

    print("ファイルの内容を読み込んでいます...")
}
readFile()

このように、ファイル操作の最後に必ず実行したい処理をdeferに書いておけば、うっかり閉じ忘れる心配がなくなります。

5. ネットワークやメモリ解放でも役立つ

5. ネットワークやメモリ解放でも役立つ
5. ネットワークやメモリ解放でも役立つ

deferはファイル操作だけでなく、ネットワーク接続を切断する処理や、一時的に確保したメモリを解放する処理などにも使えます。

例えば、インターネットに接続してサーバーからデータを取得するプログラムを書くとき、接続を閉じるのを忘れると通信が無駄に残ってしまいます。しかし、deferを使えば確実に切断処理を実行できます。

このようにdeferは、プログラミングで避けられない「片付け」を忘れないための保険のような存在です。

6. エラー処理とdeferの関係

6. エラー処理と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を使うときの注意点

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

deferは便利ですが、使いすぎるとコードが読みにくくなることもあります。特に複数のdeferを重ねすぎると、実行順序を理解しづらくなります。

また、deferの中で時間がかかる処理をすると、関数の終了が遅れる原因にもなるため注意が必要です。基本的には「片付け」や「解放」のように短い処理だけを書くのがおすすめです。

カテゴリの一覧へ
新着記事
Go言語の構造体でインターフェースを実装する方法を初心者向けにやさしく解説!
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
Go言語の文字列フォーマット!fmt.Sprintfで簡単に出力を整形する方法
Go言語のエラーと例外の違いを初心者向けに整理!わかりやすく解説
人気記事
No.1
Kotlin・Go・Swift記事の人気No1
Swiftのwhile文とrepeat while文を完全マスター!初心者にもわかる繰り返し処理の使い方と違い
No.2
Kotlin・Go・Swift記事の人気No2
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.3
Kotlin・Go・Swift記事の人気No3
Swift入門ガイド|基本構文と書き方をマスターしよう
No.4
Kotlin・Go・Swift記事の人気No4
Kotlinの正規表現(Regex)の使い方をやさしく解説!文字列操作の基本を初心者向けに学ぼう
No.5
Kotlin・Go・Swift記事の人気No5
Kotlinのコンパニオンオブジェクトとは?初心者向けに使い方と役割をわかりやすく解説!
No.6
Kotlin・Go・Swift記事の人気No6
Kotlinのwhen式を完全ガイド!初心者でもわかるパターンマッチング的な使い方
No.7
Kotlin・Go・Swift記事の人気No7
Kotlinで画面を作る!レイアウトXMLとビューの基本操作をやさしく解説
No.8
Kotlin・Go・Swift記事の人気No8
Swiftのオプショナル型とは?初心者でもわかる使い方とアンラップの基礎