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.

À partir de 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 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 dans la classe sont des constantes de temps de compilation, et cette classe peut maintenant être utilisée, par exemple, dans des instructions de switch :

 var a = Fruit.APPLE; switch (a) { case Fruit.APPLE: print('Yes!'); break; } 

Avec r41815, Dart a pris en charge nativement 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 cette version https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

Le dénombrement devrait être disponible dans le futur. Mais jusqu’à ce qu’Enum ait 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._(); } 

Ceci et ceci peuvent être les réponses sur 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 ceci:

 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 pour une utilisation. C’est un peu plus difficile de programmer la structure de l’application, mais dans certains cas, c’est mieux et plus clair.

que diriez-vous de cette approche:

 class FruitEnums { static const Ssortingng Apple = "Apple"; static const Ssortingng Banana = "Banana"; } class EnumUsageExample { void DoSomething(){ var fruit = FruitEnums.Apple; Ssortingng message; switch(fruit){ case(FruitEnums.Apple): message = "Now slicing $fruit."; break; default: message = "Now slicing $fruit via default case."; break; } } }