Joe*_*röm 6 switch-statement dart
我觉得这是一个愚蠢的问题,但我无法让它发挥作用。
我拥有的:
if (current is classA){
//do stuff
return;
}
if (current is classB){
//do stuff
return;
}
if (current is classC){
//do stuff
return;
}
Run Code Online (Sandbox Code Playgroud)
我想要的是:
switch (currentState) {
case is classA: {
//do stuff
break;
}
case is classB: {
//do stuff
break;
}
case is classC: {
//do stuff
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我真正想要的(科特林):
When (currentState){
is classA -> //do stuff
is classB -> //do stuff
is classC -> //do stuff
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我是否可以像 Kotlins When 运算符一样使用 Dart Switch,或者至少使用其他运算符 then == 来断言案例评估?
不。
Dart switch case 是一个非常低级的构造。它只允许不覆盖运算符的常量值表达式==(除了一些基本平台类型),因此可以使用identical检查有效地实现它。
没有能力进行复杂的检查,或检查对象的类型,只能进行身份检查。
推荐的漂亮方法是让 ClassA、ClassB 和 ClassC 都实现一个带有doStuff成员的接口,然后执行以下操作:
currentState.doStuff()
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,您将返回到if序列。
switch (runtimeType) {
case ClassA: //do stuff
return;
case ClassB: //do stuff
return;
}
Run Code Online (Sandbox Code Playgroud)
您不能使用与 Kotlin 中相同的语法,但可以使用Freezed。
https://pub.dev/packages/freezed
它允许您使用类似的语法。
考虑这个模型:
@freezed
abstract class Model with _$Model {
factory Model.first(String a) = First;
factory Model.second(int b, bool c) = Second;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式使用when:
var model = Model.first('42');
print(
model.when(
first: (String a) => 'first $a',
second: (int b, bool c) => 'second $b $c'
),
); // first 42
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |