0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bool?型条件分岐のベストプラクティス(Swift)

Posted at

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のやり方を採用したいですが、他の言語に普段触れてる人からするとアレルギー反応が出るようで難しいところです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?