我可以在Dart的开关盒中使用'is'运算符吗?

时间:2019-02-28 16:45:18

标签: dart switch-statement

我觉得这是一个愚蠢的问题,但我无法解决它。

我所拥有的:

if (current is classA){
   //do stuff
   return;
}
if (current is classB){
   //do stuff
   return;
}
if (current is classC){
   //do stuff
   return;
}

我想要什么:

switch (currentState) {
   case is classA: { 
      //do stuff
      break;
   }
   case is classB: { 
      //do stuff
      break;
   }
   case is classC: { 
      //do stuff
      break;
   }
}

我真正想要的(科特琳):

When (currentState){
   is classA -> //do stuff
   is classB -> //do stuff
   is classC -> //do stuff
}

无论如何,我是否可以像Kotlins When运算符一样使用Dart Switch,或者至少使用==来确定案件评估的其他运算符?

2 个答案:

答案 0 :(得分:1)

否。

Dart开关盒是一个非常低级的构造。它仅允许不覆盖运算符==的常量值表达式(少数基本平台类型除外),因此可以有效地使用identical检查来实现它。

没有能力执行复杂的检查,或检查对象的类型,仅进行身份检查。

建议的 pretty 方法是让ClassA,ClassB和ClassC都实现一个具有doStuff成员的接口,然后执行以下操作:

 currentState.doStuff()

如果不可能,则返回到if序列。

答案 1 :(得分:1)

您不能使用与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;
}

您可以通过以下方式使用when:

var model = Model.first('42');

print(
  model.when(
    first: (String a) => 'first $a',
    second: (int b, bool c) => 'second $b $c'
  ),
); // first 42