Dart supporta le enumerazioni?


Risposte:


156

A partire dalla 1.8 , puoi usare enumerazioni in questo modo:

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

Il vecchio approccio prima della 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);
}

Quelle costanti statiche all'interno della classe sono costanti del tempo di compilazione e questa classe può ora essere utilizzata, ad esempio, nelle switchistruzioni:

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

1
L'uso constnon è sempre possibile (se l'enum è costruito con attributi che non possono essere const). Ecco perché non l'ho usato nella mia risposta (anche se a volte uso constenum nel mio codice).
Alexandre Ardhuin

Accetterò questa risposta perché sarà sicuramente utile usare il tipo enum psuedo in un'istruzione switch
BraveNewMath

2
@KaiSellgren Nota Penso che la guida allo stile sia ora cambiata, quindi i valori di enum dovrebbero essere minuscoli in camel invece di tutti maiuscoli. Vedi dartlang.org/articles/style-guide/…
Greg Lowe

2
Cosa List<Fruit> value?
Tom Russell

1
Probabilmente for (Fruit value in Fruit.values)
volevi

9

Con r41815 Dart ha il supporto Enum nativo, vedere http://dartbug.com/21416 e può essere utilizzato come

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]
valore: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, index: 3
running: Status.running, 1
running index: Status.running

Una limitazione è che non è possibile impostare valori personalizzati per un elemento enum, vengono numerati automaticamente.

Maggiori dettagli in questa bozza https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


4

Questa e questa potrebbero essere le risposte alla tua domanda:

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

Puoi ancora fare qualcosa del genere:

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

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

che è secondo me più chiaro per l'uso. È un po 'più difficile programmare la struttura dell'applicazione, ma in alcuni casi è migliore e chiara.


Penso che per questo esempio sarebbe meglio lasciare fuori l'interfaccia e usare una classe. L'interfaccia è un'astrazione opzionale e
BraveNewMath

3

L'enumerazione dovrebbe essere disponibile in futuro. Ma finché Enum non è atterrato puoi fare qualcosa come:

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

  static get values => [APPLE, BANANA];

  Fruit._();
}

2

che ne dici di questo approccio:

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
Io non lo farei così. Terrò il nome in maiuscolo come Fruit.APPLE. Quindi, se volessi l'output testuale, avrei una mappa che li traduce o un supporto linguistico separatamente se volessi supportare anche altre lingue. Penso anche che le switchistruzioni funzionino meglio con gli interi, perché poi possono essere compilate in una tabella di salto.
Kai Sellgren

1

Sì! In realtà è molto utile fare Enums in Dart:

  enum fruits{
    BANANA, APPLE, ORANGE
  }

I valori minuscoli sono standard.
Pete Alvin,

0

Usa semplicemente il file di classe dei tipi.

Tipi di freccette

facile, veloce, più potente e più utile.

piccolo problema, questa classe è limitata a cinque Different Choice e più una per funge da null.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.