Swiftの今回のバージョンから追加されたguard statement
を試してみました。
基本的な使い方は下の通りです。
guard
とelse
をセットで使います。
この例のように、変数が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()