メソッドのはじめに引数の有効性をチェックして、もし不正な値だったら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
節の中では、以下のいずれかを行わないとコンパイルエラーになります。
-
noreturn
アトリビュートの付いた関数 (e.g. プログラム終了) を呼ぶ - 以下のいずれかを書く
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