web-dev-qa-db-ja.com

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

Dartは列挙型をサポートしていますか?例えば:

enum myFruitEnum { Apple, Banana }

ドキュメントをざっと検索すると、「いいえ」が示唆されます。

71
BraveNewMath

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;
}
116
Kai Sellgren

R41815でDartはネイティブEnumサポートを取得 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
value:Status.running、インデックス:1
値:Status.stopped、インデックス:2
value:Status.paused、インデックス:3
running:Status.running、1
実行中のインデックス:Status.running

制限は、enumアイテムにカスタム値を設定することはできず、自動的に番号が付けられることです。

このドラフトの詳細 https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

6

列挙は将来利用可能になるはずです。しかし、 Enumが上陸 まで、次のようなことができます:

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

  static get values => [Apple, BANANA];

  Fruit._();
}
3

This および this はあなたの質問に対する答えかもしれません:

... 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) { ... }

私の意見では、使用する方がより明確です。アプリケーション構造のプログラミングは少し難しくなりますが、場合によってはより明確でわかりやすくなります。

3
user35443

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

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
BraveNewMath