序言
文档上叫Branches,实际上呢就是条件判断,包含了 if else,switch, when之前我们也基本都有涉猎,
这篇文章再过一下
if
dart
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
非常熟悉,毫无差别。
if case
dart
if (pair case [int x, int y]) return Point(x, y);
含义是pair是一个int类型的list,有且只有2个值。
一种新的写法,和我们之前学到的模式共用,不管怎么样最终括号内的都是bool,也不难理解
Switch statements
不需要break
dart
var i = 1;
switch (i) {
case 1:
print('i is 1');
case <2:
print('i is 2');
default:
print('i is not a number');
}
看一下这个例子,你觉得最后会输出什么?
最后只输出了
dart
print('i is 1');
看看文档的描述:
When the value matches a case's pattern, the case body executes. Non-empty case clauses jump to the end of the switch after completion. They do not require a break statement. Other valid ways to end a non-empty case clause are a continue, throw, or return statement.
译文:当值匹配一个分支的模式时,执行分支体。非空case子句在执行完成后跳到切换的末尾。它们不需要break语句。其他结束非空case子句的有效方法是continue、throw或return语句。
通俗的讲,只要case子句不是空的,执行完成之后就不会再执行其他case子句。如果你想主动结束,可以使用continue、throw或return语句
空cace子句会和下一个非空子句共用一个子句。
default 等同于case _
default和 case _都是没有匹配的case,就会执行的默认操作。
dart
var i = 3;
switch (i) {
case 1:
print('i is 1');
case <2:
print('i is 2');
// default:
case _:
print('i is not a case');
}
label在switch中的用法
我们之前已经学习了label在switch中的用法,下面继续深入

在上面的例子中,在case 1的子句末尾,我们手动书写了
continue oneNext; 在case _子句的上方,我们给这个子句起了一个label,名叫oneNext
所以当i ==1时,执行完case 1的子句之后,无视条件判断直接执行了case _子句的内容。
switch表达式
switch可以用在下面的位置
dart
var x = switch (y) { ... };
print(switch (x) { ... });
return switch (x) { ... };
正常的switch案例:
dart
// Where slash, star, comma, semicolon, etc., are constant variables...
switch (charCode) {
case slash || star || plus || minus: // Logical-or pattern
token = operator(charCode);
case comma || semicolon: // Logical-or pattern
token = punctuation(charCode);
case >= digit0 && <= digit9: // Relational and logical-and patterns
token = number();
default:
throw FormatException('Invalid');
}
switch表达式简化后:
dart
token = switch (charCode) {
slash || star || plus || minus => operator(charCode),
comma || semicolon => punctuation(charCode),
>= digit0 && <= digit9 => number(),
_ => throw FormatException('Invalid'),
};
语法需要多多练习下。
Exhaustiveness checking
穷举检查
dart
bool open = false;
switch (open) {
case true:
print('open');
}

当值的范围是有限且明确,如bool,enmu等,如果未对switch语句提供对应的case且没有提供defalut子句,编译时将会报错。
Guard clause
To set an optional guard clause after a case clause, use the keyword when. A guard clause can follow if case, and both switch statements and expressions.
译文:要在case子句后面设置可选的保护子句,请使用关键字when。guard子句可以跟在if分支、switch语句和表达式之后。
dart
// Switch statement:
switch (something) {
case somePattern when some || boolean || expression:
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
body;
}
// Switch expression:
var value = switch (something) {
somePattern when some || boolean || expression => body,
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
}
// If-case statement:
if (something case somePattern when some || boolean || expression) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
body;
}