🌟

【Dart】case 文の理解を深める

2024/07/26に公開

今回はif-caseswitch-case文について書いていきます。

case文の基本

if-caseswitch-caseも、case以降に書かれた条件と合致した場合に処理を行います。

var text = "cat";

// 以下の処理はどれも同じ動作をする

if(text == "cat") { /* 何か処理 */ }

if(text case "cat") { /* 何か処理 */ }

switch (text) {
  case "cat":
    /* 何か処理 */
    break;
}

caseには||&&、比較演算子(<>など)が使えます。
(以降switch-case文の記載は省略していますが、if-case文と同じように書けます)

var num = 10;

// 0以上20以下の場合
if(num >= 0 && num <= 20) { /* 何か処理 */ }

if(num case >= 0 && <= 20) { /* 何か処理 */ }
var text = "あ";

if(text == "あ" || text == "い" || text == "う") { /* 何か処理 */ }

if(text case "あ" || "い" || "う") { /* 何か処理 */ }

whenで追加条件を指定する

caseに他の変数を使った条件を追加する時はwhenを使用します。

var num1 = 10;
var num2 = 10;

if (num1 == 10 && num2 == 10) { /* 何か処理 */}

if (num1 case 10 when num2 == 10) { /* 何か処理 */ }

if (num1 case 10 && num2 == 10) {} // エラー

case文で出来ないこと

caseを2回以上使うことは出来ません。

var num1 = 10;
var num2 = 10;

if (num1 case 10 && num2 case 10) {} // エラー

caseの条件に変数を用いることは出来ません(定数はOK)

var num1 = 10;
var num2 = 10;

if (num1 == num2) { /* 何か処理 */ }

if (num1 case num2) {} // エラー

const num3 = 10;

if (num1 case num3) {} // これはOK

変数に入れる

case以降に変数を宣言することで、変数に代入しつつ型のチェックが出来ます。

var num = 10;

if (num case int x) {
  print(x); // 10
}

// String型ではないので処理されない
if (num case String text) {
  print(text);
}

ListRecordも処理できます。

var list = [10, 20];

if (list case [int x, int y]) {
  print("$x, $y"); // 10, 20
}

// 配列には2つしか入っていないので処理されない
if (list case [int x, int y, int z]) {
  print("$x, $y, $z");
}

var record = (10, 20);

if (record case (int x, int y)) {
  print("$x, $y"); // 10, 20
}

// 何故かSet型には非対応
var set = {10, 20};
if (set case {int x, int y}) {} // エラー

応用編

以上の書き方を組み合わせると、色々できて便利です。

// Mapを変数に入れて扱いやすくする

var map = {"a": 10, "b": 20};

if (map["a"] case int x) {
  print(x); // 10
}

if ([map["a"], map["b"]] case [int x, int y]) {
  print("$x, $y"); // 10, 20
}
// 変数への代入とwhenを組み合わせる

var text = "a cat";

// 半角スペースが含まれていたら処理
if (text case String sentence when sentence.contains(" ")) {
  print(sentence); // a cat
}
// 比較と型のチェック(変数に代入)を同時に行う

var num = 10;

if (num case >= 10 && int x) {
  print(x); // 10
}

var list = [10, "a"]; // List<Object>

// 配列の1番目がint型かつ0以上で、2番目がString型かつ"a"の場合のみ処理
if (list case [int x && >= 0, String text && "a"]) {
  print("$x, $text"); // 10, a
}

// Object型に比較演算子を使う場合、
// 型のチェックを先にしないとエラーになる
if (list case [>= 0 && int x, String text && "a"]) { // エラー
  print("$x, $text");
}

参考文献

備考

本記事は以下の環境で検証しました

Dart SDK version: 3.4.4 (stable) (Wed Jun 12 15:54:31 2024 +0000) on "macos_arm64"
GitHubで編集を提案
合同会社zoome(ズーム)

Discussion