Чи підтримує Dart перелічення?


Відповіді:


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 у своєму коді).
Alexandre Ardhuin

я прийму цю відповідь, оскільки, безумовно, буде корисним використовувати тип перерахування
psuedo

2
@KaiSellgren Примітка. Я думаю, що керівництво по стилю тепер змінено, тому значення перерахування повинні бути нижчими з верблюжого регістру замість усіх шапок. Див. Dartlang.org/articles/style-guide/…
Грег Лоу,

2
Що List<Fruit> value?
Том Рассел

1
Ви, мабуть, мали намір писати for (Fruit value in Fruit.values), інакше Дарт показує помилку
неправильно

9

З r41815 Дарт отримав рідну підтримку 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, індекс: 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


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твердження найкраще працюють на цілих числах, тому що тоді їх можна скласти до таблиці переходів.
Kai Sellgren


0

Просто використовуйте Файл класу типів.

Дарт-типи

легко, швидко, потужніше та корисніше.

невелика проблема, саме цей клас обмежений п’ятьма різними варіантами та плюс один для нульових дій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.