Dartは列挙をサポートしていますか?


回答:


150

始まり1.8、あなたはこのような列挙型を使用することができます。

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

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

クラス内のこれらの静的定数はコンパイル時定数であり、このクラスは、たとえば次のswitchステートメントで使用できるようになりました。

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

1
使用constできるとは限りません(列挙型が使用できない属性で作成されている場合const)。そのため、回答では使用しませんでした(ただしconst、コードで列挙型を使用することもあります)。
Alexandre Ardhuin 2012

switchステートメントで疑似列挙型を使用すると確かに役立つため、この回答を受け入れます
BraveNewMath 2012

2
@KaiSellgren注スタイルガイドが変更されたと思うので、列挙値はすべて大文字ではなく小文字のキャメルケースにする必要があります。dartlang.org/articles/style-guide/を
Greg Lowe

2
なにList<Fruit> value
トムラッセル

1
あなたはおそらく書くfor (Fruit value in Fruit.values)
つもりでし

9

r41815ダートが得たでネイティブ列挙型のサポートが見http://dartbug.com/21416と同様に使用することができます

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]
値:Status.none、インデックス:0
値:Status.running、インデックス:1
値:Status.stopped、インデックス:2
値:Status.paused、インデックス:3
実行中:Status.running、1
実行中インデックス:Status.running

制限は、列挙型アイテムにカスタム値を設定することはおそらく不可能であり、それらは自動的に番号が付けられることです。

詳細については、このドラフトhttps://www.dartlang.org/docs/spec/EnumsTC52draft.pdfをご覧ください。


4

これこれはあなたの質問に対する答えかもしれません:

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

あなたはまだこのようなことをすることができます:

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

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

私の意見では、どちらが使用するのがより明確です。アプリケーション構造のプログラミングは少し難しいですが、場合によっては、より適切で明確です。


この例では、インターフェイスを省略してクラスを使用する方がよいと思います。インターフェイスはオプションの抽象化であり、
BraveNewMath 2012


2

このアプローチはどうですか?

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
私はこのようにはしません。名前は大文字のままにしますFruit.APPLE。次に、テキスト出力が必要な場合は、それらを翻訳するマップ、または他の言語もサポートしたい場合は、いくつかの言語サポートを個別に用意します。また、switchステートメントは整数で最適に機能すると思います。整数を使用すると、ジャンプテーブルにコンパイルできるからです。
カイセルグレン2012


0

タイプクラスファイルを使用するだけです。

ダーツタイプ

簡単、高速、より強力で、より役立つ。

少し問題ですが、このクラスは5つの異なる選択肢に制限されており、さらに1つはnullとして機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.