【入門編】Dartの「switch式」で複数のパターンを「or(|)」で結合する際の可読性向上 – Dart コア文法・オブジェクト指向・Null安全解析バイブル

こんにちは!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コードは一気にモダンで洗練されたものになります。ぜひ、今日の開発から日々のコードに取り入れてみてくださいね。

それでは、また次回の技術解説でお会いしましょう!バッチリ使いこなしていきましょう!

タイトルとURLをコピーしました