文字っぽいの。

文字を書いています。写真も混ざります。

Swiftの`guard`を読みやすくするコツ

Swiftのguardは非常に便利で賢い仕組みですが、その性質上 Rubyunless などと混同されてしまい、可読性が下がると誤解されがちです。

おそらく、guardを難しく感じている人はこのような読み方をしていると思います。

たしかにこれでは条件式を読解した上で、elseでその条件が否定するため難しく感じるでしょう。例えば、

guard !userClient.isLoggedIn else {
    // ログイン済み時の処理
    return
}

// 未ログイン時の処理

といったコードの場合、isLoggedIn!isLoggedInelse と読んでしまうため、「ログインして"いない"、"ではない"」みたいに否定の否定でややこしく感じます。

ここで一旦if-else構文のことを考えてみましょう。if-elseを読む時に、このような読み方はしないと思います。

シンプルに上から読んでいって、次の画像の流れになると思います。

これと同じ形で guard も読めば良いです。

これなら否定の否定は発生せず、素直に条件文を読むことができますね。

guard の性質上、すぐにelse時の処理が書かれているためそこを読んでしまいがちですが、guard という文法は「早期リターンである」ことを明示した構文です。これはdo-catch のcatch側と類似しているため、ブロック内には主に例外処理が含まれています。その前提があれば、guardを読む際には、中身を飛ばして(条件の否定をせず)読めば良くなるため、否定の否定をする必要はなく複雑さが減ると思います。

なお、本記事では簡単のために「これならifの方が良くない?」というコードサンプルになってしまっていますが、実際のコードではOptional Bindingや値チェックなどが入ってくると思います。

あわせてよみたい