web-dev-qa-db-ja.com

Dartで列挙型を構築するにはどうすればよいですか?

Dart言語には列挙型がありません(まだ?)。少なくとも言語機能が到着するまで、列挙型を構築する適切なまたは慣用的な方法は何ですか?

48
Seth Ladd

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

制限は、enumアイテムにカスタム値を設定する可能性がないことであり、自動的に番号が付けられます。

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

12

Dartはenumsをサポートするようになりました。

この回答の残りは、ダート<= 1.8に対するものです。 1.8を使用する場合は、列挙型に対してDartの正式なサポートを使用します(別の回答で説明)。

確かに、Dart言語には(まだ?)列挙型はありません。 未解決の問題 があります。

それまでの間、独自の列挙型を作成するための慣用的なDartスニペットを次に示します。

class Enum {
  final _value;
  const Enum._internal(this._value);
  toString() => 'Enum.$_value';

  static const FOO = const Enum._internal('FOO');
  static const BAR = const Enum._internal('BAR');
  static const BAZ = const Enum._internal('BAZ');
}

Constコンストラクタを使用すると、この列挙型をスイッチで使用できます。次に例を示します。

class Fruits {
  final _value;
  const Fruits._internal(this._value);
  toString() => 'Enum.$_value';

  static const Apple = const Fruits._internal('Apple');
  static const PEAR = const Fruits._internal('PEAR');
  static const BANANA = const Fruits._internal('BANANA');
}

void main() {
  var yummy = Fruits.BANANA;

  switch (yummy) {
    case Fruits.Apple:
      print('an Apple a day');
      break;
    case Fruits.PEAR:
      print('genus Pyrus in the family Rosaceae');
      break;
    case Fruits.BANANA:
      print('open from the bottom, it is easier');
      break;
  }
}
53
Seth Ladd

私は Dart Web Toolkit でEnumクラスの少し単純なバージョンを使用しています:

/**
 * Emulation of Java Enum class.
 *
 * Example:
 *
 * class Meter<int> extends Enum<int> {
 *
 *  const Meter(int val) : super (val);
 *
 *  static const Meter HIGH = const Meter(100);
 *  static const Meter MIDDLE = const Meter(50);
 *  static const Meter LOW = const Meter(10);
 * }
 *
 * and usage:
 *
 * assert (Meter.HIGH, 100);
 * assert (Meter.HIGH is Meter);
 */
abstract class Enum<T> {

  final T _value;

  const Enum(this._value);

  T get value => _value;
}
11
akserg

私は列挙型のトップレベルの定数が好きです。インポートを使用して衝突を修正できます。これにより、列挙型の使用が大幅に少なくなります。

つまり.

if (m == high) {}

の代わりに:

if (m == Meter.high) {}

列挙型の定義:

class Meter<int> extends Enum<int> {
   const Meter(int val) : super (val);
}

const Meter high = const Meter(100);
const Meter middle = const Meter(50);
const Meter low = const Meter(10);
4
Greg Lowe