Unterstützt Dart Aufzählungen?

85

Unterstützt Dart Aufzählungen? Zum Beispiel:

enum myFruitEnum { Apple, Banana }

Eine flüchtige Suche in den Dokumenten schlägt nein vor.

BraveNewMath
quelle
Ja. Dart unterstützt Enums
MJ Montes

Antworten:

147

Ab 1.8 können Sie folgende Aufzählungen verwenden:

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

Der alte Ansatz vor 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);
}

Diese statischen Konstanten innerhalb der Klasse sind Konstanten für die Kompilierungszeit, und diese Klasse kann jetzt beispielsweise in switchAnweisungen verwendet werden:

var a = Fruit.APPLE;
switch (a) {
  case Fruit.APPLE:
    print('Yes!');
    break;
}
Kai Sellgren
quelle
1
Die Verwendung constist nicht immer möglich (wenn die Aufzählung mit Attributen erstellt wurde, die nicht möglich sind const). Deshalb habe ich es in meiner Antwort nicht verwendet (obwohl ich manchmal constEnum in meinem Code verwende).
Alexandre Ardhuin
Ich werde diese Antwort akzeptieren, weil es sicherlich nützlich sein wird, den Pseudo-Aufzählungstyp in einer switch-Anweisung zu verwenden
BraveNewMath
1
@KaiSellgren Hinweis Ich denke, der Styleguide hat sich jetzt geändert, daher sollten die Enum-Werte anstelle aller Großbuchstaben kleiner sein. Siehe dartlang.org/articles/style-guide/…
Greg Lowe
2
Was ist List<Fruit> value?
Tom Russell
1
Sie for (Fruit value in Fruit.values)
wollten
9

Mit r41815 hat Dart native Enum-Unterstützung erhalten, siehe http://dartbug.com/21416 und kann wie verwendet werden

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

Eine Einschränkung besteht darin, dass möglicherweise keine benutzerdefinierten Werte für ein Aufzählungselement festgelegt werden können. Sie werden automatisch nummeriert.

Weitere Details finden Sie in diesem Entwurf unter https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

Günter Zöchbauer
quelle
4

Dies und das können die Antworten auf Ihre Frage sein:

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

Sie können immer noch so etwas tun:

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

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

was meiner Meinung nach klarer für den Gebrauch ist. Es ist etwas schwieriger, die Anwendungsstruktur zu programmieren, aber in einigen Fällen ist es besser und klarer.

user35443
quelle
Ich denke für dieses Beispiel wäre es besser, die Schnittstelle wegzulassen und eine Klasse zu verwenden. Schnittstelle ist eine optionale Abstraktion und
BraveNewMath
3

Die Aufzählung sollte in Zukunft verfügbar sein. Aber bis Enum gelandet ist , können Sie Folgendes tun:

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

  static get values => [APPLE, BANANA];

  Fruit._();
}
Alexandre Ardhuin
quelle
2

Wie wäre es mit diesem Ansatz:

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;
    }
  }
}
BraveNewMath
quelle
2
Ich würde es nicht so machen. Ich würde den Namen in Großbuchstaben als halten Fruit.APPLE. Wenn ich dann eine Textausgabe wünschte, hätte ich eine Karte, die sie übersetzt, oder eine Sprachunterstützung separat, wenn ich auch andere Sprachen unterstützen wollte. Ich denke auch, dass switchAnweisungen am besten für ganze Zahlen funktionieren, da sie dann zu einer Sprungtabelle kompiliert werden können.
Kai Sellgren
0

Ja! Es ist eigentlich sehr nützlich, Enums in Dart zu machen:

  enum fruits{
    BANANA, APPLE, ORANGE
  }
Beloin Sena
quelle
0

Verwenden Sie einfach Types Class File.

Dart-Typen

einfach, schnell, leistungsfähiger und hilfreicher.

Kein Problem, es ist diese Klasse, die auf fünf verschiedene Auswahlmöglichkeiten und plus eine für Nullen beschränkt ist.

NabilJaran
quelle