はじめに
私が実際にやってしまった失敗です。
SwiftLintで Unused Optional Binding のルールに引っかかり、以下のように修正しました。
- guard let _ = foo, let _ = bar else {
+ guard foo != nil || bar != nil else {
return
}
こちらの修正に何の疑問も抱かない方は、 本記事を最後まで読むことをおすすめします 。
すぐに気づいた方は、本記事を読まなくても大丈夫です。
結論
先に結論を述べます。
Swiftの条件式において、,
と &&
はほぼ同義 なので、先ほどの修正は以下が正しいです。
- guard let _ = foo, let _ = bar else {
+ guard foo != nil && bar != nil else {
return
}
証明
簡単なプログラムを組み、上記の結論を証明します。
func exampleBefore(foo: Int?, bar: String?) -> Bool {
guard let _ = foo, let _ = bar else {
return false
}
return true
}
func exampleAfter(foo: Int?, bar: String?) -> Bool {
guard foo != nil && bar != nil else {
return false
}
return true
}
exampleBefore(foo: nil, bar: nil) // false
exampleBefore(foo: 1, bar: nil) // false
exampleBefore(foo: nil, bar: "example") // false
exampleBefore(foo: 1, bar: "example") // true
exampleAfter(foo: nil, bar: nil) // false
exampleAfter(foo: 1, bar: nil) // false
exampleAfter(foo: nil, bar: "example") // false
exampleAfter(foo: 1, bar: "example") // true
このプログラムをプレイグラウンドで実行してみます。
exampleBefore
と exampleAfter
の戻り値が同じになり、先ほどの結論が正しいことを証明できました。
おまけ
条件式に ,
を多用すると可読性が落ちることがあるため、if-letまたはguard-let文以外では使わないほうがいいと思いました。
,
を使える言語は私の知る限りSwiftのみなので、他の言語から入った方は &&
のほうが読みやすいはずです。
おまけ2
他の方が ,
と &&
をどう使い分けているか気になったので、Twitterでアンケートを取ってみました。
結果は私と同じくif-letまたはguard-let文のみで使う方が45.9%で最も多かったです。
ただ「できる限り ,
を使う」というkoherさんの意見が興味深かったので紹介します。
,
を優先して使う理由を丁寧に言語化されており、私も真似しようか検討中です。
「 ,
は小さくて見づらいから、使うときは必ず改行する」という意見もありました。
こちらの意見もなるほどと思い、私も ,
を使う際は改行しようと思いました。