web-dev-qa-db-fra.com

Dart prend-il en charge les énumérations?

Dart prend-il en charge les énumérations? Par exemple:

enum myFruitEnum { Apple, Banana }

Une recherche rapide des documents suggère non.

71
BraveNewMath

Début 1.8 , vous pouvez utiliser des énumérations comme ceci:

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

L'ancienne approche avant 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);
}

Ces constantes statiques au sein de la classe sont des constantes de temps de compilation, et cette classe peut désormais être utilisée dans, par exemple, les instructions switch:

var a = Fruit.Apple;
switch (a) {
  case Fruit.Apple:
    print('Yes!');
    break;
}
116
Kai Sellgren

Avec r41815, Dart a obtenu le support natif d'Enum voir http://dartbug.com/21416 et peut être utilisé comme

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]
valeur: Status.none, index: 0
valeur: Status.running, index: 1
valeur: Status.stopped, index: 2
valeur: Status.paused, index: 3
en cours d'exécution: Status.running, 1
index en cours d'exécution: Status.running

Une limitation est qu'il n'est pas possible de définir des valeurs personnalisées pour un élément enum, elles sont automatiquement numérotées.

Plus de détails dans ce projet https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

6
Günter Zöchbauer

L'énumération devrait être disponible à l'avenir. Mais jusqu'à ce que Enum a atterri vous pouvez faire quelque chose comme:

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

  static get values => [Apple, BANANA];

  Fruit._();
}
3
Alexandre Ardhuin

This et this peuvent être les réponses à votre question:

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

Vous pouvez toujours faire quelque chose comme ça:

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

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

ce qui est à mon avis plus clair d'utilisation. C'est un peu plus difficile pour programmer la structure de l'application, mais dans certains cas, c'est mieux et clair.

3
user35443

que diriez-vous de cette approche:

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
BraveNewMath