🔖

【Dart入門(7)】制御フロー|条件分岐(switch case)

に公開

Dartの制御フローについて

dartの制御フローには以下のようなものが存在します。

制御フロー一覧
  • 分岐
    • if
      • Aが〜と等しい時
      • Aの中に〜がない時など
    • if else if else:
      • Aが〜でなくて**の時など条件を複数使用した時(多すぎる時はswitch文の方が可読性が高い)
    • if case
      • Aが〜な型の時
      • Aを分解したい時(後で説明します)
    • if case when
      • Aが〜な型の時で、各要素に対して**が成立するときなど
    • switch
      • Aが〜なケースの時などケースが複数ある時に使用
  • ループ
    • for
      • 一定回数繰り返したい時
      • 要素を取り出して各々に操作をしたい時
    • while
      • 先に条件判定して、条件を満たすまでループさせたい時
    • do while
      • 先に実行して、条件を満たすまでループさせたい時
    • break, continue(ループ処理の中で用いる)
  • 例外処理
    • try, on, catch
      • on: 予期している例外に対処する
      • catch: 予期しない例外に対処する

これらの制御フローは今すぐ理解する必要はありませんが、なんとなくこういうのがあるのかと認識しておくことが大切です。


分岐を詳しく見ていく

分岐にはifif caseswitch caseが存在します。
今回はswitch caseについて見ていきます。

caseの復習

caseとはパターンマッチングするかを判定するもので以下のように使用するのでした。

A case B(マッチングパターン)

ここでBのマッチングパターンには以下のようなパターンがありました。

dartのパターンマッチングの種類
  • 論理和パターン
  • 論理積パターン
  • リレーショナルパターン
  • nullチェックパターン
  • 定数パターン
  • 変数パターン
  • 識別子パターン
  • 括弧パターン
  • リストパターン
  • Mapパターン
  • Recordパターン
  • オブジェクトパターン
  • ワイルドカード

このパターンはswitch case文でも使用できます。なので、if caseを理解していればswitch caseは理解していると同然です。ifswitchの使い分けは、分岐パターンが複数ある時かそうでないか程度なのでswitch case文は流し読みでも構いません。

switch case文の使い方

switch case は、変数や式の値に応じて複数の分岐処理を切り替えるために使います。基本構文は以下の通りです。

switch (値や変数) {
  case パターン1:
    // パターン1にマッチしたときの処理
    break;

  case パターン2:
    // パターン2にマッチしたときの処理
    break;

  default:
    // どのパターンにもマッチしなかったときの処理
}

シンプルな例

void main() {
  var day = 'Monday';

  switch (day) {
    case 'Monday':
      print('今日は月曜日です');
      break; // breakはあってもなくてもokです。
    case 'Tuesday':
      print('今日は火曜日です');
      break;
    default:
      print('それ以外の日です');
  }
}

出力:

今日は月曜日です

パターンマッチングを活用した例

Dart 3 以降では、switch でもパターンマッチングを活用できます。

void main() {
  // Record型です
  (int, int) point = (10, 20);

 // Record型のマッチングパターンです
  switch (point) {
    case (0, 0):
      print('原点です');
      break;
    case (var x, 0):
      print('X軸上の点です: x=$x');
      break;
    case (0, var y):
      print('Y軸上の点です: y=$y');
      break;
  // case when 文です
    case (var x, var y) when x == y:
      print('x と y が同じ値です: ($x, $y)');
      break;
    default:
      print('その他の点です');
  }
}

出力例:

その他の点です

ポイント
when キーワードを使うと、追加条件を記述できます。上の例では「x と y が同じ場合」という条件を when で表現しています。


列挙型(enum)と組み合わせるとさらに便利

enum を使うと、分岐がより安全で読みやすくなります。

enum Weather { sunny, cloudy, rainy }

void main() {
  var today = Weather.sunny;

  switch (today) {
    case Weather.sunny:
      print('今日は晴れです');
      break;
    case Weather.cloudy:
      print('今日は曇りです');
      break;
    case Weather.rainy:
      print('今日は雨です');
      break;
  }
}

出力:

今日は晴れです

Tip
Dart では enum を使うと、switch 文で全てのケースを網羅しないと警告が出るため、将来的に安全にコードを拡張しやすくなります。


switch文を使うときのコツ

  • 条件が3つ以上になるときは、if より switch の方が読みやすいことが多いです。
  • Dart 3 以降のパターンマッチングを使うと、型や構造を分解して条件分岐できるため、複雑なオブジェクトを扱うときに便利です。
  • when キーワードを使うと、パターンマッチングにさらに条件を追加できます。

まとめ

このほかにもsealed classを使用したswitch文などもありますが、それはその都度解説します。

Discussion