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


Réponses:


151

À partir de la 1.8 , vous pouvez utiliser des énumérations comme celle-ci:

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 la 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 maintenant être utilisée, par exemple, dans des switchinstructions:

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

1
L'utilisation constn'est pas toujours possible (si l'énumération est construite avec des attributs qui ne peuvent pas l'être const). C'est pourquoi je ne l'ai pas utilisé dans ma réponse (bien que j'utilise parfois constenum dans mon code).
Alexandre Ardhuin

J'accepterai cette réponse car il sera certainement utile d'utiliser le type psuedo enum dans une instruction switch
BraveNewMath

2
@KaiSellgren Remarque Je pense que le guide de style a maintenant changé, donc les valeurs d'énumération devraient être en bas de cas de chameau au lieu de toutes les majuscules. Voir dartlang.org/articles/style-guide
Greg Lowe

2
Quoi List<Fruit> value?
Tom Russell

1
Vous for (Fruit value in Fruit.values)
vouliez

9

Avec r41815 Dart a 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
value: 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 d'énumération, elles sont automatiquement numérotées.

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


4

Ceci et ceci peut être la réponse à 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 à utiliser. C'est un peu plus difficile pour programmer la structure de l'application, mais dans certains cas, c'est mieux et clair.


Je pense que pour cet exemple, il serait préférable de laisser de côté l'interface et d'utiliser une classe. L'interface est une abstraction facultative et
BraveNewMath

3

L'énumération devrait être disponible à l'avenir. 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._();
}

2

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
Je ne ferais pas ça comme ça moi-même. Je garderais le nom en majuscules comme Fruit.APPLE. Ensuite, si je voulais une sortie textuelle, j'aurais une carte qui les traduit ou une prise en charge de la langue séparément si je voulais également prendre en charge d'autres langues. Je pense aussi que les switchinstructions fonctionnent mieux sur les entiers, car elles peuvent ensuite être compilées en une table de saut.
Kai Sellgren

0

Oui! C'est en fait très utile de faire des Enums dans Dart:

  enum fruits{
    BANANA, APPLE, ORANGE
  }

Les valeurs minuscules sont standard.
Pete Alvin

0

Utilisez simplement le fichier de classe Types.

Types de fléchettes

facile, rapide, plus puissant et plus utile.

petit problème, c'est cette classe limitée à cinq Choix Différents et plus un pour les actes comme nul.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.