2023年 - 使用Dart 3.0模式匹配的
switch
代码概述
class Dog {
Dog({required this.name});
final String name;
}
class Cat {
Cat({required this.name});
final String name;
}
String checkType(dynamic v) {
String type;
switch (v) {
case Dog(:final name):
type = 'dog, $name';
case Cat cat:
type = 'cat, ${cat.name}';
case int:
type = 'int';
case (String name, String age):
type = 'Record ($name, $age)';
case {'user': {'name': final String name, 'age': final int age}}:
type = 'User Json $name, $age';
default:
type = 'unknown';
}
return type;
}
对象解构
switch (v) {
case Dog(name:final name):
switch (v) {
case Dog(:final name):
⚠️ 文档:如果值的类型不同,则将其驳斥。
你应该使用正确的类型来解构对象。
只需使用
final
或
var
来指示数据类型,以便始终使用相同类型的对象字段。
return switch (v) {
Dog(:String age) => 'dog, $age',
Dog(name: String otherName) => 'dog, $otherName',
Dog(:int name) => 'dog, $name',
Dog(:String name) => 'dog, $name',
只需将其分配给变量(可以使用前缀
final
来声明为常量)。
case Cat cat:
type = 'cat, ${cat.name}';
or
case final Cat cat:
type = 'cat, ${cat.name}';
记录销毁
case (String name, String age):
type = 'Record ($name, $age)';
地图破坏
case {'user': {'name': final String name, 'age': final int age}}:
type = 'User Json $name, $age';
你还可以使用
switch
表达式。
String checkType(dynamic v) {
return switch (v) {
Dog(:final name) => 'dog, $name',
Cat cat => 'cat, ${cat.name}',
int => 'int',
(String name, String age) => 'Record ($name, $age)',
{'user': {'name': final String name, 'age': final int age}} =>
'User Json $name, $age',
_ => 'unknown',
};
}
你可以在
Dart文档中查看更多信息。
map
来处理所有情况,或者使用maybeMap()
来仅处理你需要的情况。 - Ariel