75043


swiftの`guard`を使った`guard-let`は便利だと思うのですが、`guard
条件式`は`if`との棲み分けの仕方がわかりません。どこで`guard 条件式`を使うべきなんでしょうか?

以下の二つの関数は同じ動きをしていて、意味もなく`guard`を使わずに`if`を使った方がいい気がします。

[code]

    func f1(_ a: Int) {
        if a <= 0 {
            print("数値は0以下です")
            return
        }
        print("つづく")
    }
    
    func f2(_ a: Int) {
        guard a > 0 else {
            print("数値は0以下です")
            return
        }
        print("つづく")
    }
    
[/code]


CC BY-SA 4.0
2021-03-29T14:29:07.003
74969
2021-04-02T10:01:16.760
40856
question
swift
guardの条件判定での使い道について


`guard`はその意味の通り危険を避けるときに使います。  
ガード条件に合致しない場合はそれ以降の処理が実行不能である場合などです。  
そのため`guard`の中では`return`や`throw`が強制されるようになっています。  
`assert`や`precondition`の緩いものと考えればよいかと思います。

このルールに従っていればコードを読む助けになります。


CC BY-SA 4.0
2021-03-30T01:10:44.670
74978
2021-03-30T01:10:44.670
2741
74969
answer


> 意味もなくguardを使わずにifを使った方がいい気がします。

まさにそのとおりで、意味もなくguardを使うぐらいなら、ifを使うべきです。

guardは、それ以降の処理を行わないということを明示するために使います。  
そのため、guardの{}内では重要な処理を行わず、早めにreturn等で関数から抜けることが原則です。


CC BY-SA 4.0
2021-03-30T01:49:47.200
74980
2021-03-30T01:49:47.200
8077
74969
answer


masakihさんの回答を言い直しているだけかも知れませんが、  
`guard`文は、幾つかのスクリプト言語にある`unless`（if notに近い条件分岐文です）とは大きく違います。

まず、意味の無い`guard`文というのが疑問で、なんでも意味の無い文の使い方はよくないです。ある条件とそれ以外の2つしかない`switch`文だって、`if`文で充分だよね？ってなりますよね。

そして、`guard`文には関数やクロージャーの先頭で、その関数やクロージャーを実行する条件を満たしているか判断する。満たしていない場合は即座にそれ以降の処理を諦めるという役目があり、そのため`guard`文の`else`節には`return`か`throw`が必須なのです。

また、`guard`文の判定部は成立する条件を書くため、これこれの条件が満たされていない場合(`else`)と、`guard`文以降を実行する条件をわかりやすく書けるメリットがあります。(`not`条件で考える必要が無い)

更に`guard`文で`optional
binding`を行った場合、`let`で代入したローカル変数は`guard`文があるブロック全体で有効であるというメリットもあります。  
これは、`if`文で`optional
binding`を行った場合`if`に続く`{}`ブロックの中でのみ`let`で代入したローカル変数が有効でないため、気がつくとネストが深くなることを防いでくれます。

以上により、`guard`文は関数、クロージャーの入り口で、その関数やクロージャーの実行可否を判定するためには積極的に使うべきといっても間違いでは無いと思います。

一番の問題は今のところ`Swift`にのみある文法なので、見慣れないから気持ち悪い、使いにくいと言う点があるのではないでしょうか？  
積極的に使って見慣れてしまえば、`guard`文の使い処にも慣れ、これは`if`文で書くべきでは？という疑問にも簡単に答えが出るようになると思います。


CC BY-SA 4.0
2021-04-02T10:01:16.760
75043
2021-04-02T10:01:16.760
14745
74969
answer