Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. guard / guard let / guard var

guard / guard let / guard var

Swiftの『guard』文は、条件を満たさない場合に早期リターンを強制する構文です。Optionalのアンラップと条件チェックをまとめて行い、ネストを減らしてコードを読みやすくします。

構文
// guard文の基本
guard 条件 else {
    // 条件を満たさない場合(return/throw/breakが必要)
    return
}

// guard let でOptionalをアンラップ
guard let 定数名 = Optional値 else {
    return
}
// ここから定数名を使える

// 複数条件
guard let x = optX, let y = optY, x > 0 else {
    return
}
構文一覧
構文概要
guard 条件 else { return }条件が偽の場合に早期リターンします。
guard let 定数 = Optional else { }Optionalをアンラップし、nilなら早期リターンします。
guard var 変数 = Optional else { }アンラップした値を変数として取得します。
guard 条件1, 条件2 else { }複数の条件をカンマで繋げて同時チェックします。
guard ... else { throw エラー }条件を満たさない場合にエラーをスローします。
guard ... else { break }ループ内でguardを使い、条件を満たさない場合に抜けます。
サンプルコード
// guard let でOptionalアンラップ
func greet(name: String?) {
    guard let name = name else {
        print("名前がありません")
        return
    }
    // ここからnameは非Optionalとして使える
    print("こんにちは、\(name)さん!")
}

greet(name: "太郎")
greet(name: nil)

// 複数条件のguard
func processOrder(userID: Int?, amount: Double?) {
    guard let userID = userID, let amount = amount, amount > 0 else {
        print("無効な注文情報です")
        return
    }
    print("ユーザー \(userID) の注文: \(amount)円")
}

processOrder(userID: 42, amount: 1500.0)
processOrder(userID: nil, amount: 500.0)
processOrder(userID: 10, amount: -100.0)

// if let との比較(guardの方がネストが少ない)
func checkAge(age: Int?) {
    guard let age = age, age >= 18 else {
        print("18歳未満または年齢不明")
        return
    }
    print("年齢 \(age) は有効です")
}

checkAge(age: 25)
checkAge(age: 15)
概要

『guard』文のelse節には必ず『return』『throw』『break』『continue』などの制御転送文が必要です。これにより、guardを通過した後のコードでは条件が常に満たされていることが保証されます。

『guard let』でアンラップした定数・変数は、guardのelse節を除いたスコープ全体で使用できます。これは『if let』とは異なり、ネストせずに安全な値を扱える利点です。else節の末尾で制御転送文を書き忘れるとコンパイルエラーになります。

Optionalの基本についてはOptional / ? / !を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。