Bool?型の変数で条件分岐を行うパターンはよく登場しますが、イマイチ現場ごとに正しいやり方は定まってなさそうです。
なのでよく使われる手法を紹介しつつ、新たな手法も提唱します。
1.王道の手法
シンプルに??でアンラップするやり方です。
let hoge: Bool? = true
if hoge ?? false {
fuga()
}
trueで動作する場合はいいですが、反転させたい時はかなり醜いコードになります。
let hoge: Bool? = true
if !(hoge ?? true) {
fuga()
}
2.アンラップしない手法
何故か宗教上の理由で嫌う人が多い手法です。
オプショナルであると明示されないのが嫌われる要因でしょうか。
false発火でも変わらず書けるので個人的には一番わかりやすいと思います。
let hoge: Bool? = true
if hoge == true {
fuga()
}
if hoge == false {
piyo()
}
3.extensionを利用する手法
一つ目の手法の反転だけが特に酷いので、それを改善できる手法です。
Boolには元々toggle()関数があるため可読性は落ちないと思っています。
let hoge: Bool? = true
if hoge?.toggled ?? false {
fuga()
}
extension Bool {
var toggled: Bool {
return !self
}
}
反転演算子!
はそもそもオプショナルと相性悪いので、この手法を利用しないにしてもこのextensionは作る価値があるかと思います。
// nilならfalseに、そうでないなら反転させたい時。
// 二つは同じ演算結果だが後者の方が直感的にわかりやすい。
let hoge1 = !(fuga?.isPiyo ?? true)
let hoge2 = fuga?.isPiyo.toggled ?? false
まとめ
結局のところ好みによると思うので、チーム開発なら皆が納得する落とし所を探す形になるかと思います。
個人的には2のやり方を採用したいですが、他の言語に普段触れてる人からするとアレルギー反応が出るようで難しいところです。