しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift2.0で追加されたguard statementを試してみる

Swiftの今回のバージョンから追加されたguard statementを試してみました。

基本的な使い方は下の通りです。
guardelseをセットで使います。
この例のように、変数がnilだった場合はブロック内に入ります。

ブロックの中ではreturnを書かないとエラーになります。

func method() {
    var a = Dictionary<String,Int>()
    a["key"] = 1
    
    guard let value = a["key"] else {
        print("nil")
        return
    }
    print(1)
}

method()

Swift1.2までだと下のような書き方をしていました。
guard statementがないので早期returnができませんでした。

func method() {
    var a = Dictionary<String,Int>()
    a["key"] = 1
    
    if let value = a["key"] {
        print(value)
    } else {
        print("nil")
    }
}

method()

guard~elseで宣言した変数はブロックの下でも利用できます。

func method() {
    var a = Dictionary<String,Int>()
    a["key"] = 1
    
    guard let value = a["key"] else {
        print("nil")
        return
    }
    print(value)
}

method()

guard~elseの中で宣言した変数はOptional型ではなくなっています。

func method() {
    var a = Dictionary<String,Int>()
    a["key"] = 1
    
    guard let value = a["key"] else {
        print("nil")
        return
    }
    let value2 = a["key"]
    print(value2!.toIntMax()) // これはOptional型なので ! か ? が必要
    print(value.toIntMax()) // Optional型ではないので ! も ? もいらない
}

method()

if letと同様にwhere節も使えます。
こちらは条件がfalseの時に括弧内の処理が走ります。
頭の中で条件を逆に変換するのが少し大変そうです。

func method() {
    var a = Dictionary<String,Int>()
    a["key"] = 1
    
    guard let value = a["key"] where value != 1 else {
        print("nil")
        return
    }
    print(value)
}

method()