Le langage Dart n'a pas d'énumérations (encore ??). Quelle est la façon appropriée ou idiomatique de construire une énumération, au moins jusqu'à ce qu'une fonctionnalité linguistique arrive?
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
Dart prend désormais en charge les énumérations .
Le reste de cette réponse est pour Dart <= 1,8. Si vous utilisez> 1.8, utilisez le support formel de Dart pour les énumérations (expliqué dans une autre réponse).
C'est vrai, le langage Dart n'a pas (encore?) D'énumérations. Il y a un problème ouvert pour cela.
En attendant, voici un extrait de fléchettes idiomatique pour créer votre propre énumération.
class Enum {
final _value;
const Enum._internal(this._value);
toString() => 'Enum.$_value';
static const FOO = const Enum._internal('FOO');
static const BAR = const Enum._internal('BAR');
static const BAZ = const Enum._internal('BAZ');
}
L'utilisation de constructeurs const signifie que vous pouvez utiliser cette énumération dans un commutateur. Voici un exemple:
class Fruits {
final _value;
const Fruits._internal(this._value);
toString() => 'Enum.$_value';
static const Apple = const Fruits._internal('Apple');
static const PEAR = const Fruits._internal('PEAR');
static const BANANA = const Fruits._internal('BANANA');
}
void main() {
var yummy = Fruits.BANANA;
switch (yummy) {
case Fruits.Apple:
print('an Apple a day');
break;
case Fruits.PEAR:
print('genus Pyrus in the family Rosaceae');
break;
case Fruits.BANANA:
print('open from the bottom, it is easier');
break;
}
}
J'utilise une version un peu plus simple de la classe Enum dans Dart Web Toolkit :
/**
* Emulation of Java Enum class.
*
* Example:
*
* class Meter<int> extends Enum<int> {
*
* const Meter(int val) : super (val);
*
* static const Meter HIGH = const Meter(100);
* static const Meter MIDDLE = const Meter(50);
* static const Meter LOW = const Meter(10);
* }
*
* and usage:
*
* assert (Meter.HIGH, 100);
* assert (Meter.HIGH is Meter);
*/
abstract class Enum<T> {
final T _value;
const Enum(this._value);
T get value => _value;
}
J'aime les constantes de haut niveau pour mes énumérations. Vous pouvez utiliser les importations pour corriger les collisions. Cela rend l'utilisation des énumérations beaucoup moins verbeuse.
c'est à dire.
if (m == high) {}
au lieu de:
if (m == Meter.high) {}
Définition de l'énumération:
class Meter<int> extends Enum<int> {
const Meter(int val) : super (val);
}
const Meter high = const Meter(100);
const Meter middle = const Meter(50);
const Meter low = const Meter(10);