ようこそ、Dartの世界へ。
今日は、Dart 3という大きなアップデートで導入された、プログラミングの書き方を劇的に変える「魔法」についてお話ししましょう。
かつて、私たちは条件分岐を書く際、コンピュータに「こうして、ああして」と命令を並べる必要がありました。しかし、現代のDartは違います。私たちは「これは、これである」と、定義(式)としてコードを書くことができるようになったのです。
その主役が、今回解説する「switch式(Switch Expressions)」です。
この技術をマスターすれば、あなたのコードから不自然な一時変数が消え、バグが入り込む隙のない、美しく堅牢なプログラムが書けるようになりますよ。「ここをクリアすれば、Dartの基本はバッチリマスターできます」と言い切れるほど重要なポイントです。
さあ、一緒に深淵を覗いてみましょう。
—
1. なぜ「式」であることが重要なのか?
これまでのDart(〜2.19まで)の `switch` は「文(Statement)」でした。
「文」とは、コンピュータに「実行」を命じるものですが、それ自体は値を持ちません。
そのため、結果を受け取るためにわざわざ「空の変数」を用意する必要がありました。
以前の書き方(ボイラープレートが多い例)
String describeColor(Color color) {
late String result; // 1. まず変数を用意する(これが面倒!)
switch (color) {
case Color.red:
result = ‘情熱の赤’; // 2. 代入する
break; // 3. breakを忘れるとバグる
case Color.blue:
result = ‘冷静の青’;
break;
default:
result = ‘未知の色’;
}
return result; // 4. 最後に返す
}
この書き方には、「変数が書き換え可能(Mutable)である」「`break`を書き忘れるリスクがある」「すべてのケースを網羅しているかコンパイラが教えてくれない」という弱点がありました。
Dart 3の「switch式」は、これらをすべて解決します。
—
2. switch式の基本:値を直接「返す」美学
switch式を使うと、`switch` そのものが値を持ちます。
まずは、先ほどのコードがどれだけスッキリするか見てみましょう。
Dart 3の書き方(switch式)
String describeColor(Color color) => switch (color) {
Color.red => ‘情熱の赤’,
Color.blue => ‘冷静の青’,
_ => ‘未知の色’, // _ は「それ以外すべて」を意味するワイルドカード
};
どうですか? 驚くほど短くなりましたよね。
ここがポイント!
- `=>`(アロー)を使う: `case` や `break` はもう不要です。
- セミコロン `;` ではなくカンマ `,` で区切る: `switch` 全体が一つの式だからです。
- 結果を直接返せる: `return` と組み合わせて、関数を一行(Expression-bodied member)で書けます。
—
3. 型安全の極致:網羅性チェック(Exhaustiveness Checking)
私がDartのアーキテクトとして最も誇りに思っているのが、この網羅性チェックです。
通常、`switch` を書くときは「`default` ケース(その他)」を書くのが一般的ですが、実は `default` を書かない方が安全な場面があります。それが、列挙型(enum)や `sealed` クラス を使うときです。
コンパイラが「漏れ」を指摘してくれる
sealed class Shape {}
class Circle extends Shape { final double radius; Circle(this.radius); }
class Square extends Shape { final double side; Square(this.side); }
double calculateArea(Shape shape) {
return switch (shape) {
Circle(radius: var r) => 3.14 r r,
Square(side: var s) => s s,
// ここで Shape の新しい派生クラスが増えた場合、
// コンパイラが「ケースが足りないよ!」とエラーを出してくれます。
};
}
DartのAOT(Ahead-of-Time)コンパイラは、コンパイル時に「すべてのパターンが考慮されているか」を厳密に計算します。
もしあなたが新しい図形 `Triangle` を追加したのに、`switch` 式の更新を忘れたら、プログラムは実行される前にエラーを吐きます。これは、「実行時のクラッシュを、コードを書いている最中に防ぐ」という究極の安全策なのです。
—
4. 初学者が陥りやすい「文法エラー」の処方箋
switch式は強力ですが、これまでの `switch` 文と混同しやすいポイントがいくつかあります。
① `_`(ワイルドカード)の使いすぎに注意
`_ => …` を書くと、どんな値でも受け入れてしまいます。
しかし、前述の `sealed` クラスなどを使う場合は、あえて `_` を書かないのがプロの技です。そうすることで、将来クラスが増えた時にコンパイラに頼ることができるからです。
② 文と式の区別
- switch文: `switch (x) { case …: break; }` (何か処理を実行したい時)
- switch式: `var y = switch (x) { … };` (結果の値が欲しい時)
最後が `;`(セミコロン)で終わるのが「式」としての代入文であることを忘れないでくださいね。
—
5. まとめ:Dartを掌握するために
Dart 3のswitch式は、単なる「短縮記法」ではありません。
それは、「副作用を減らし、データの流れを直線的にする」という、現代的なプログラミング思想の現れです。
1. ボイラープレートを捨てましょう: `break` や一時変数はもう卒業です。
2. コンパイラを味方にしましょう: `sealed` クラスと組み合わせて、網羅性チェックの恩恵を最大限に受けましょう。
3. 意図を明確にしましょう: 「何を計算しているのか」がひと目で分かるコードは、チームの財産になります。
Dart VMの中では、これらの式は非常に効率的なジャンプテーブルや型判定に最適化されます。あなたが美しく書けば書くほど、Dartはそれに応えて高速に動作します。
「ここをマスターすれば、Dartの基本はバッチリです」。
自信を持って、あなたのコードにこの「式」を取り入れてみてください。次は、さらに高度なパターンマッチングの世界でお会いしましょう!