Edited at

Swift 2.0 で追加された guard のいいところ

More than 1 year has passed since last update.

メソッドのはじめに引数の有効性をチェックして、もし不正な値だったらreturnする、というようなコードが書きやすくなる構文です。

func show(message: String?) {

// messageがnilだったらreturnする
guard let theMessage = message else { // (1)
return // (2)
}

print(theMessage)
}

(1) messageをアンラップ (messageがnilでなければtheMessageに値が入る)

(2) messageをアンラップできなければ (messageがnilなら) return


いいとこ1: guard文でアンラップした変数を後で使える

よくある if 文でnilチェックする方法だと、nilチェックの後にオプショナル変数をアンラップする必要が出てきます。

func show(message: String?) {

if message == nil {
return
}
let theMessage = message! // ここ
// ...
}

func show(message: String?) {

if message == nil {
return
}
if let theMessage = message { // ここ
// ...
}
}

guard を使えばアンラップとnilチェックを同時に行え、アンラップされた変数はguard文を抜けた後でも使用することができます。

func show(message: String?) {

guard let theMessage = message else {
return
}

print(theMessage) // アンラップした変数を使うことができる
}


いいとこ2: guardの条件に合わなかったらすぐにスコープから抜けることが保証される

guard文の else 節の中では、以下のいずれかを行わないとコンパイルエラーになります。



  1. noreturn アトリビュートの付いた関数 (e.g. プログラム終了) を呼ぶ

  2. 以下のいずれかを書く


    • return

    • break

    • continue

    • throw



よって、チェックに引っかかったけど return を書き忘れて処理が続行される、といううっかりミスがなくなります。


参考

http://furuya02.hatenablog.com/entry/2015/08/15/102224

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html#//apple_ref/swift/grammar/guard-statement