Dart Switch 表达式
最后修改日期:2025 年 6 月 4 日
在 Dart 中,**switch 表达式** 提供了一种简洁而强大的**模式匹配**方法。它们在 Dart 3.0 中引入,提高了可读性,并提供了一种比传统 switch 语句更具表达力的替代方案。
与传统的 switch 语句不同,switch 表达式会计算出一个值,从而实现更灵活的控制流。它们支持**穷举检查**,确保所有可能的情况都得到处理,并集成了高级模式匹配,以最少的代码实现复杂的条件逻辑。
基本 Switch 表达式
switch 表达式最简单的形式匹配常量值。它根据匹配到的情况返回一个值。
void main() {
var day = 'Monday';
var message = switch (day) {
'Monday' => 'Start of work week',
'Friday' => 'Almost weekend',
'Saturday' || 'Sunday' => 'Weekend!',
_ => 'Midweek day',
};
print(message);
}
此示例显示了一个匹配字符串值的基本 switch 表达式。下划线 (_) 是默认情况。该表达式返回一个赋给 message 的字符串。
$ dart main.dart Start of work week
匹配 Enum 值
Switch 表达式与枚举(enums)特别契合。Dart 在切换枚举时可确保穷举检查。
enum Status { pending, approved, rejected }
void main() {
var currentStatus = Status.approved;
var response = switch (currentStatus) {
Status.pending => 'Please wait',
Status.approved => 'Request approved',
Status.rejected => 'Request denied',
};
print(response);
}
Switch 表达式涵盖了所有可能的枚举值。如果缺少任何枚举值,Dart 会发出警告。这可以防止由于未处理的情况而导致的运行时错误。
$ dart main.dart Request approved
使用 Record 进行模式匹配
Switch 表达式可以解构并匹配 Dart 的 record。这使得以简洁的语法实现复杂的模式匹配成为可能。
void main() {
var point = (2, 3);
var quadrant = switch (point) {
(0, 0) => 'Origin',
(var x, var y) when x > 0 && y > 0 => 'Quadrant I',
(var x, var y) when x < 0 && y > 0 => 'Quadrant II',
(var x, var y) when x < 0 && y < 0 => 'Quadrant III',
(var x, var y) when x > 0 && y < 0 => 'Quadrant IV',
(_, _) => 'On axis',
};
print(quadrant);
}
此示例匹配代表点的 record。它使用 `when` 保护子句进行条件匹配。变量 `x` 和 `y` 从 record 中提取。
$ dart main.dart Quadrant I
匹配对象类型
Switch 表达式可以匹配和转换对象类型。这对于以类型安全的方式处理不同类型很有用。
abstract class Shape {}
class Circle implements Shape {
final double radius;
Circle(this.radius);
}
class Square implements Shape {
final double side;
Square(this.side);
}
void main() {
Shape shape = Circle(5.0);
var area = switch (shape) {
Circle(radius: var r) => 3.14 * r * r,
Square(side: var s) => s * s,
_ => 0.0,
};
print('Area: $area');
}
Switch 表达式匹配 `Shape` 的具体类型。它使用对象模式提取属性。这提供了类型安全的属性访问,无需显式转换。
$ dart main.dart Area: 78.5
高级模式匹配
Switch 表达式支持包括嵌套模式和逻辑运算符在内的复杂模式。这使得复杂的匹配场景成为可能。
void main() {
var data = [
['admin', '12345'],
['user', 'password'],
['guest', null]
];
for (var creds in data) {
var access = switch (creds) {
['admin', _] => 'Full access',
['user', var pwd?] when pwd.length >= 8 => 'User access',
['user', _] => 'Weak password',
[_, null] => 'No password',
_ => 'Unknown user',
};
print('${creds[0]}: $access');
}
}
此示例显示了带有条件逻辑的嵌套列表模式。模式匹配列表的结构和内容。保护子句提供了额外的条件。
$ dart main.dart admin: Full access user: Weak password guest: No password
最佳实践
- 穷举性: 确保覆盖所有可能的情况。
- 可读性: 保持模式简单明了。
- 类型安全: 使用模式匹配进行类型安全的转换。
- 保护子句: 使用 `when` 子句处理复杂条件。
来源
本教程通过实际示例介绍了 Dart 的 switch 表达式,演示了它们的模式匹配功能和简洁的语法。
作者
列出 所有 Dart 教程。