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

87

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

enum myFruitEnum { Apple, Banana }

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

СмелыйНовый
источник
1
code.google.com/p/dart/issues/detail?id=88 - похоже, нет
Mat
да. Dart поддерживает Enums
MJ Montes

Ответы:

151

Начиная с 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). Вот почему я не использовал его в своем ответе (хотя иногда я использую constenum в своем коде).
Александр Ардхуин
Я приму этот ответ, потому что, безусловно, будет полезно использовать тип
psuedo
2
@KaiSellgren Примечание. Я думаю, что руководство по стилю теперь изменилось, поэтому значения enum должны быть в нижнем регистре, а не в верхнем регистре. См. Dartlang.org/articles/style-guide/…
Грег Лоу
2
Что List<Fruit> value?
Том Рассел
1
Вы, наверное, for (Fruit value in Fruit.values)
хотели
9

С 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.paused]
значение: Status.none, индекс: 0
значение: Status.running, index: 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) { ... }

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

user35443
источник
Я думаю, что для этого примера было бы лучше не использовать интерфейс и использовать класс. Интерфейс - это необязательная абстракция и
BraveNewMath
3

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

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

  static get values => [APPLE, BANANA];

  Fruit._();
}
Александр Ардуин
источник
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операторы лучше всего работают с целыми числами, потому что тогда они могут быть скомпилированы в таблицу переходов.
Кай Селлгрен
0

Да! На самом деле очень полезно делать Enums в Dart:

  enum fruits{
    BANANA, APPLE, ORANGE
  }
Белоин Сена
источник
Строчные значения являются стандартными.
Пит Элвин,
0

Просто используйте файл классов типов.

Типы дротиков

проще, быстрее, мощнее и полезнее.

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

НабильДжаран
источник