web-dev-qa-db-fra.com

Comment puis-je créer une énumération avec Dart?

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?

48
Seth Ladd

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

12
Günter Zöchbauer

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;
  }
}
53
Seth Ladd

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;
}
11
akserg

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);
4
Greg Lowe