guardはSwift2.0から取り入れられた、比較的新しいものです。
必須条件を書いて、一般的にはそれが成立しない場合にreturnなどで関数から抜けたりします。
Swiftでguardを使う
1 2 3 4 5 6 7 8 |
func printIf10Over (x: Int) { // 10以上ではなく、条件を満たさないのでreturn guard x >= 10 else { return } print(x) } printIf10Over(x: 4) // printIf10Over(x: 13) // 13 |
10以上だった場合にprintする関数で、最初にguard文で10未満のものを除外している。
いわゆる、早期リターンという方法でよく使われる。
guard文の良いところ
例えば、if文で以下のように書くことももちろんできる
1 2 3 4 5 6 7 8 |
func printIf10Over (x: Int) { // 10以上ではなく、条件を満たさないのでreturn if !(x >= 10) { return } print(x) } printIf10Over(x: 4) // printIf10Over(x: 13) // 13 |
結果的には同じ。
例えば、それぞれにreturnがあるが、これをコメントアウトするとguard文ではエラーになる。
早期リターンでreturnを書き忘れるのは良くあることで、それの予防にもguardは有効。
他には
- break
- continue
- throw
なんかも使えるので、うまく使ってみよう。
guardでnilチェック, アンラップをする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
func printNum (num: Int?) { guard let unwrappedNum = num else { print("nil") return } print(num) print(unwrappedNum) } printNum(num: 13) // Optional(13) // 13 printNum(num: nil) // nil |
こんな感じで書いてあげれば、numをアンラップしてくれたり、nilだった場合に処理を中断させたりできるよ。
こちらもif文で書けるけど、guardの方が何をしてるか一目瞭然なので積極的に使っていこう。