Dart是否支持枚举?

Bra*_*ath 74 enums dart

Dart是否支持枚举?例如:

enum myFruitEnum { Apple, Banana }
Run Code Online (Sandbox Code Playgroud)

粗略搜索文档表明没有.

Kai*_*ren 123

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]);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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

var a = Fruit.APPLE;
switch (a) {
  case Fruit.APPLE:
    print('Yes!');
    break;
}
Run Code Online (Sandbox Code Playgroud)

  • @KaiSellgren 注意我认为风格指南现在已经改变,所以枚举值应该是小驼峰而不是全部大写。见 https://www.dartlang.org/articles/style-guide/#prefer-using-lowercamelcase-for-constant-names (2认同)
  • 什么是`List&lt;Fruit&gt; 值`? (2认同)
  • 您可能打算编写 `for (Fruit value in Fruit.values)`,否则 Dart 会显示错误 (2认同)

Gün*_*uer 6

有了r41815,Dart得到了原生的Enum支持,请参阅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]}');
}
Run Code Online (Sandbox Code Playgroud)

[Status.none,Status.running,Status.stopped,Status.paused]
value:Status.none,index:0
value:Status.running,index:1
value:Status.stopped,index:2
value:Status.paused, index:3
运行:Status.running,1
运行索引:Status.running

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

本草案中的更多细节https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


Ale*_*uin 5

枚举将来应该可用。但在Enum 落地之前,您可以执行以下操作:

class Fruit {
  static final APPLE = new Fruit._();
  static final BANANA = new Fruit._();

  static get values => [APPLE, BANANA];

  Fruit._();
}
Run Code Online (Sandbox Code Playgroud)