こんにちは!FlutterやDartの開発現場で、日々コードの美しさとパフォーマンスに向き合っている先輩エンジニアです。
今回は、Dart 3で導入された革命的な機能の一つである「switch式(Switch Expressions)」、そしてその中で複数の条件をスマートにまとめる「論理和パターン(`|`)」について、深く掘り下げてお話ししていきますね。
他の言語(JavaScriptやJavaなど)からDartに入ってきた方だと、「あれ、switch文ってこんなにスッキリ書けたっけ?」と感動すること間違いなしの機能です。ここをクリアすれば、あなたのDartコードは一気にモダンで読みやすくなりますよ。それでは、一緒にマスターしていきましょう!
—
1. 従来の `switch`文が抱えていた「冗長さ」の正体
まずは、これまでのDart(あるいは多くのプログラミング言語)で見慣れた、伝統的な `switch` 文を見てみましょう。
例えば、「曜日の種類(平日・週末・休日)を判定する関数」を書く場合、こんなコードになっていませんでしたか?
// 従来の switch 文の例
String getDayType(String day) {
String result;
switch (day) {
case ‘月’:
case ‘火’:
case ‘水’:
case ‘木’:
case ‘金’:
result = ‘平日’;
break;
case ‘土’:
case ‘日’:
result = ‘週末’;
break;
case ‘祝日’:
result = ‘休日’;
break;
default:
result = ‘不明’;
}
return result;
}
なんだか縦に長くて、`break;` を書き忘れる恐怖(フォールスルーのバグ)と戦う必要がありますよね。「月」から「金」まで、まったく同じ処理をするために `case` を何行も並べるのは、コードのノイズを増やす原因になってしまいます。
—
2. Dart 3の「switch式」と「論理和パターン(`|`)」で劇的スマートに!
Dart 3では、言語のパラダイムが大きく進化し、`switch`を「文(Statement)」ではなく「式(Expression)」として扱えるようになりました。さらに、パターンマッチングの導入により、複数の条件を `|`(パイプ)でつないで一撃で表現できるようになったんです。
先ほどのコードを、Dart 3の `switch`式と論理和パターンを使って書き直してみましょう。
// Dart 3 の switch式 + 論理和パターンの例
String getDayType(String day) {
return switch (day) {
‘月’ || ‘火’ || ‘水’ || ‘木’ || ‘金’ => ‘平日’,
‘土’ || ‘日’ => ‘週末’,
‘祝日’ => ‘休日’,
_ => ‘不明’, // どのパターンにも一致しない場合(defaultの代わり)
};
}
なにこれ、すごくスッキリしていませんか……!
ここで注目してほしいポイントを整理しますね。
1. 関数全体が `return switch (day) { … };` という「式」になっている
- 変数を宣言して途中で代入する必要がありません。評価された結果がそのまま返されます。
2. 論理和パターン(`|`)で条件を結合している
- `’月’ || ‘火’ || ‘水’ || ‘木’ || ‘金’` のように書くことで、「月曜、または火曜、または……」という条件を1行で表現できます。
3. アロー構文(`=>`)の採用
- 各ケースの右側に処理を直感的に記述でき、`break` を書く必要もなくなりました(自動的にbreakされます)。
4. 網羅性のチェック(Exhaustiveness checking)
- Dartのコンパイラは優秀なので、もし想定外の値(例えば「未知の文字列」など)が入りうる場合、`_`(ワイルドカードパターン)でフォールバックを書き忘れると、コンパイルエラーで教えてくれます。安全性が段違いですね!
—
3. 実践!FlutterのUIやビジネスロジックで活かす例
実際の開発現場では、APIから取得したステータスコードや、ユーザーの権限ロール(Role)の判定などでこのテクニックが猛威を振るいます。
もう少し実践的な例を見てみましょう。
enum UserRole { admin, moderator, premiumUser, freeUser, guest }
String getAccessLevel(UserRole role) {
return switch (role) {
UserRole.admin || UserRole.moderator => ‘フルアクセス権限’,
UserRole.premiumUser => ‘プレミアム特典アクセス’,
UserRole.freeUser || UserRole.guest => ‘制限付きアクセス’,
};
}
enum(列挙型)のハンドリングでも、論理和パターンを使うことで「似た権限のグループ化」が非常に美しく決まります。もし将来的に新しいenumが追加された場合も、コンパイラが「新しい値がswitch式で処理されていませんよ!」と怒ってくれるため、バグを未然に防ぐことができます。
—
4. 初学者が陥りやすい「文法エラー」の罠と注意点
非常に便利な `switch` 式と論理和パターンですが、使い慣れないうちは以下のようなミスでコンパイルエラーになることがあります。よくあるポイントを先回りしてシェアしておきますね。
① `case` キー워ードは書かない!
古いDartの `switch` 文の感覚が残っていると、つい `case ‘月’ || ‘火’` と書いてしまいがちです。
`switch`「式」の中では `case` キーワードは不要です。値とパターンを直接書くルールになっています。
- NG: `case ‘月’ || ‘火’ => ‘平日’,`
- OK: `’月’ || ‘火’ => ‘平日’,`
② セミコロン(`;`)の位置に注意
`switch` 式は「式(Expression)」なので、文の最後には必ずセミコロン `;` が必要です。
String message = switch (score) {
100 => ‘満点!’,
>= 80 => ‘合格!’,
_ => ‘がんばろう’,
}; // ← ここにセミコロンが必須です!
—
まとめ
今回は、Dart 3の `switch`式と論理和パターン(`|`)を使った、コードを劇的に簡潔にするテクニックをご紹介しました。
- 複数の条件分岐が縦に長くなってしまうときは、`||` でつないでスマートにまとめられる。
- `switch` は「文」から「式」へ進化し、`break` や冗長な変数宣言が不要になった。
- コンパイラの網羅性チェックが働くため、安全で堅牢なコードが書ける。
ここをマスターできれば、あなたのDartコードは一気にモダンで洗練されたものになります。ぜひ、今日の開発から日々のコードに取り入れてみてくださいね。
それでは、また次回の技術解説でお会いしましょう!バッチリ使いこなしていきましょう!