🌟
【Dart】case 文の理解を深める
今回はif-case
やswitch-case
文について書いていきます。
case
文の基本
if-case
もswitch-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);
}
List
やRecord
も処理できます。
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"
Discussion