三項演算子とは、いわゆる:?を用いて条件分岐を作るもの。
↓サンプルコード
void main() {
true // 条件式
? print('true') // trueの場合に実行する処理
: print('false'); // falseの場合実行する処理
}
// 実行結果
// true
分岐する先が2つなら三項演算子を使うとうまく書けることが多いです。
しかし分岐先が3つ4つと増えてくると、ネストさせて書く必要が出てきます。
ネストした三項演算子の書き方
三項演算子の処理の部分に条件式を書き、その条件式を元に新しい三項演算子を作ることでネストできます。インデントの位置を見るとどの処理をしているのか理解しやすいかも。いくつか例を上げてみます。
※条件式であることを明示するために()で囲っています。この記述はあってもなくても問題ありません。
1. 分岐先が3つ、ひとつめの条件がtrueなら分岐
void main() {
(true)
? (false)
? print('1')
: print('2')
: print('3');
}
// 実行結果
// 2
2. 分岐先が3つ、ひとつめの条件がfalseなら分岐
void main() {
(false)
? print('1')
: (false)
? print('2')
: print('3');
}
// 実行結果
// 3
3. forループ内で、1回目、2回目、3回目で別の処理をする
void main() {
for (int i = 0; i < 3; i++;){
(i == 0)
? print('$i')
: (i == 1)
? print('$i')
: print('$i');
}
}
// 実行結果
// 0
// 1
// 2
例2と同じ書き方で分岐させることができる。
余談? ぶっちゃけif else~を使えばいいのでは
例ではインデントで誤魔化したものの、やはり三項演算子は少し読みにくいですよね。ネストしてるとなると尚更それは顕著だと思います。
なので、基本的にはif elseを使って書くのがベターかなというのが僕個人の意見です。
ただ、if文が使えず三項演算子なら使える場面があるので今回の記事を書くに至りました。具体的な状況については以下の記事で詳しく記載されています。
【Flutter】Widgetをif文で制御する方法
記事内では関数の返り値として利用する方法も紹介されていますが、Providerを使っていると関数内でrefオブジェクトがそのまま取得できず、それはそれで面倒になりました......
そのため、分岐先が3つくらいまでなら三項演算子で分岐させて、それ以上の分岐が必要なら関数として切り出してif elseを使うのがバランスがいいかなと思いました。