0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Swift 異常ケースを先に処理する guard の活用法

Posted at

はじめに

Swift の guard は「異常ケースを先に処理する」ためのツールです。特にオプショナルのアンラップやバリデーションのチェックに適しており、コードの可読性を向上させることができます。


guard の基本

guard「条件を満たさない場合に処理を中断する」 という考え方です。

基本構文

guard 条件 else {
    // 条件が false の場合に実行する処理(早期リターン)
}

else ブロック内では returnthrow などでスコープを抜ける必要があります。これにより

  • 異常ケースを先に処理できる
  • 正常な処理をフラットに記述できる

というメリットがあります。


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 よりも ネストが浅くなり、可読性が向上
  • オプショナルバインディングやバリデーションに最適
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?