Подтвердить что ты не робот

Поддерживает ли Дарт перечисления?

Поддерживает ли Дарт перечисления? Например:

enum myFruitEnum { Apple, Banana }

Беглый поиск документов предполагает отсутствие.

4b9b3361

Ответ 1

Начиная с 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;
}

Ответ 2

С 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]}');
}

[Status.none, Status.running, Status.stopped, Status.pauseed]
value: Status.none, index: 0
value: Status.running, index: 1
значение: Status.stopped, index: 2
value: Status.pause, index: 3
running: Status.running, 1
индекс выполнения: Status.running

Ограничение состоит в том, что не возможно устанавливать пользовательские значения для элемента перечисления, они автоматически нумеруются.

Подробнее в этом проекте https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

Ответ 3

Перечисление должно быть доступно в будущем. Но пока Enum приземлился, вы можете сделать что-то вроде:

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

  static get values => [APPLE, BANANA];

  Fruit._();
}

Ответ 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) { ... }

который, на мой взгляд, более понятен для использования. Это немного сложнее для программирования структуры приложения, но в некоторых случаях это лучше и понятно.

Ответ 5

как насчет этого подхода:

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;
    }
  }
}