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.