はじめに
Swift の guard
は「異常ケースを先に処理する」ためのツールです。特にオプショナルのアンラップやバリデーションのチェックに適しており、コードの可読性を向上させることができます。
guard
の基本
guard
は 「条件を満たさない場合に処理を中断する」 という考え方です。
基本構文
guard 条件 else {
// 条件が false の場合に実行する処理(早期リターン)
}
else
ブロック内では return
や throw
などでスコープを抜ける必要があります。これにより
- 異常ケースを先に処理できる
- 正常な処理をフラットに記述できる
というメリットがあります。
if
との違い
Swift では if
でも同じような条件分岐ができますが、guard
を使うことで コードのネストを減らし、意図が明確になる という利点があります。
❌ if
の場合(ネストが深くなる)
func process(value: String?) {
if let unwrappedValue = value {
print("値は \(unwrappedValue) です")
} else {
print("値が nil です")
return
}
}
⭕️ guard
の場合(異常ケースを先に処理)
func process(value: String?) {
guard let unwrappedValue = value else {
print("値が nil です")
return
}
print("値は \(unwrappedValue) です")
}
guard
のメリット:
-
else
ブロックで異常ケースを先に処理 → 正常な処理がフラットに書ける -
value
をアンラップした変数がスコープ内で使える
guard
を活用する場面
1. オプショナルのアンラップ(バリデーション)
guard let
を使うと、値が nil
の場合に即座に処理を中断できます。
func validateUser(name: String?) {
guard let name = name, !name.isEmpty else {
print("名前が無効です")
return
}
print("ユーザー名: \(name)")
}
2. ネストを減らす(複数の条件チェック)
if
を使うとネストが増えがちですが、guard
を使うとスッキリ書けます。
❌ if
だとネストが深い
func checkAge(age: Int?) {
if let age = age {
if age >= 18 {
print("成人です")
} else {
print("未成年です")
}
} else {
print("年齢が設定されていません")
}
}
⭕️ guard
で整理
func checkAge(age: Int?) {
guard let age = age else {
print("年齢が設定されていません")
return
}
guard age >= 18 else {
print("未成年です")
return
}
print("成人です")
}
-
guard
を使うことで 異常ケースを先に処理し、正常処理をフラットに記述 できる
3. 早期リターンで処理を最適化
関数内で特定の条件を満たさない場合、guard
で不要な計算をスキップできます。
func processData(data: [Int]?) {
guard let data = data, !data.isEmpty else {
print("データがありません")
return
}
print("データの処理を開始: \(data)")
}
guard
を使うシーン
✅ オプショナルのアンラップ(guard let
)
✅ バリデーションチェック(前提条件の確認)
✅ エラーハンドリング(異常ケースの即時処理)
✅ 非オプショナルの変数を確保し、スコープ全体で使いたい場合
まとめ
-
guard
を使うと 「異常ケースを先に処理」 できる -
if
よりも ネストが浅くなり、可読性が向上 - オプショナルバインディングやバリデーションに最適