Dart是否支持枚举?


Answers:


150

1.8开始,您可以使用如下枚举:

enum Fruit {
  apple, banana
}

main() {
  var a = Fruit.apple;
  switch (a) {
    case Fruit.apple:
      print('it is an apple');
      break;
  }

  // get all the values of the enums
  for (List<Fruit> value in Fruit.values) {
    print(value);
  }

  // get the second value
  print(Fruit.values[1]);
}

1.8之前的旧方法:

class Fruit {
  static const APPLE = const Fruit._(0);
  static const BANANA = const Fruit._(1);

  static get values => [APPLE, BANANA];

  final int value;

  const Fruit._(this.value);
}

该类中的那些静态常量是编译时常量,并且该类现在可以在例如switch语句中使用:

var a = Fruit.APPLE;
switch (a) {
  case Fruit.APPLE:
    print('Yes!');
    break;
}

1
const并非总是可以使用的(如果枚举是使用无法创建的属性构建的const)。这就是为什么我没有在答案中使用它的原因(尽管有时const我在代码中使用枚举)。
Alexandre Ardhuin 2012年

我将接受此答案,因为在switch语句中使用
psuedo

2
@KaiSellgren注意,我认为样式指南现已更改,因此枚举值应为小写驼峰字母,而不是全部大写字母。参见dartlang.org/articles/style-guide/…–
Greg Lowe,

2
什么List<Fruit> value
汤姆·罗素

1
您可能打算写for (Fruit value in Fruit.values),否则Dart会显示错误
正确的结果,2018年

9

通过r41815,Dart获得了本机枚举支持,请参见http://dartbug.com/21416,并且可以像

enum Status {
  none,
  running,
  stopped,
  paused
}

void main() {
  print(Status.values);
  Status.values.forEach((v) => print('value: $v, index: ${v.index}'));
  print('running: ${Status.running}, ${Status.running.index}');
  print('running index: ${Status.values[1]}');
}

[Status.none,Status.running,Status.stopped,Status.paused]
值:Status.none,索引:0
值:Status.running,索引:1
值:Status.stopped,索引:2
值:Status.paused,索引:3个
正在运行:Status.running,1个
正在运行索引:Status.running

一个限制是不可能为枚举项设置自定义值,它们会自动编号。

此草稿中的更多详细信息https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


4

可能是对你的问题的答案:

... for the technology preview it was decided to leave it out and just 
use static final fields for now. It may be added later.

您仍然可以执行以下操作:

interface ConnectionState { }
class Connected implements ConnectionState { }
class Connecting implements ConnectionState { }
class Disconnected implements ConnectionState { }

//later
ConnectionState connectionState;
if (connectionState is Connecting) { ... }

在我看来,它更清楚地使用。对应用程序结构进行编程要困难一些,但是在某些情况下,它更好并且更清楚。


我认为对于此示例,最好省去接口并使用一个类。接口是可选的抽象,并且
BraveNewMath 2012年


2

这种方法怎么样:

class FruitEnums {
  static const String Apple = "Apple";
  static const String Banana = "Banana";
}

class EnumUsageExample {

  void DoSomething(){

    var fruit = FruitEnums.Apple;
    String message;
    switch(fruit){
      case(FruitEnums.Apple):
        message = "Now slicing $fruit.";
        break;
      default:
        message = "Now slicing $fruit via default case.";
        break;
    }
  }
}

2
我自己不会那样做。我将名称大写保留为Fruit.APPLE。然后,如果我想要文本输出,那么如果我也想支持其他语言,那么我将有一张地图来分别翻译它们或某种语言支持。我还认为switch语句对整数最有效,因为这样它们就可以编译成跳转表。
凯塞格伦2012年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.