列挙型
列挙型、しばしばenumerationsまたはenumsと呼ばれるものは、固定数の定数値を表すために使用される特別な種類のクラスです。
単純な列挙型の宣言
#単純な列挙型を宣言するには、enumキーワードを使用し、列挙したい値をリストします。
dart
enum Color { red, green, blue }拡張列挙型の宣言
#Dartでは、列挙型宣言にフィールド、メソッド、および定数コンストラクタを持つクラスを宣言することもできます。これらは、固定数の既知の定数インスタンスに限定されます。
拡張列挙型を宣言するには、通常のクラスに似た構文に従いますが、いくつかの追加要件があります。
- インスタンス変数は、ミックスインによって追加されたものも含め、finalである必要があります。
- すべての生成コンストラクタは定数である必要があります。
- ファクトリコンストラクタは、固定された既知の列挙型インスタンスのいずれかのみを返すことができます。
- Enumが自動的に拡張されるため、他のクラスを拡張することはできません。
- index、- hashCode、等価演算子- ==のオーバーライドはできません。
- 列挙型にvaluesという名前のメンバーを宣言することはできません。これは、自動生成される静的valuesゲッターと競合するためです。
- 列挙型のすべてのインスタンスは、宣言の先頭で宣言する必要があり、少なくとも1つのインスタンスが宣言されている必要があります。
拡張列挙型のインスタンスメソッドでは、thisを使用して現在の列挙型値を参照できます。
複数のインスタンス、インスタンス変数、ゲッター、および実装されたインターフェースを持つ拡張列挙型を宣言する例を以下に示します。
dart
enum Vehicle implements Comparable<Vehicle> {
  car(tires: 4, passengers: 5, carbonPerKilometer: 400),
  bus(tires: 6, passengers: 50, carbonPerKilometer: 800),
  bicycle(tires: 2, passengers: 1, carbonPerKilometer: 0);
  const Vehicle({
    required this.tires,
    required this.passengers,
    required this.carbonPerKilometer,
  });
  final int tires;
  final int passengers;
  final int carbonPerKilometer;
  int get carbonFootprint => (carbonPerKilometer / passengers).round();
  bool get isTwoWheeled => this == Vehicle.bicycle;
  @override
  int compareTo(Vehicle other) => carbonFootprint - other.carbonFootprint;
}列挙型の使用
#他の静的変数と同様に、列挙型値にアクセスします。
dart
final favoriteColor = Color.blue;
if (favoriteColor == Color.blue) {
  print('Your favorite color is blue!');
}列挙型の各値にはindexゲッターがあり、これは列挙型宣言での値のゼロベースの位置を返します。たとえば、最初の値のインデックスは0、2番目の値のインデックスは1です。
dart
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);すべての列挙型値のリストを取得するには、列挙型のvalues定数を使用します。
dart
List<Color> colors = Color.values;
assert(colors[2] == Color.blue);switch文で列挙型を使用でき、列挙型のすべての値を処理しない場合、警告が表示されます。
dart
var aColor = Color.blue;
switch (aColor) {
  case Color.red:
    print('Red as roses!');
  case Color.green:
    print('Green as grass!');
  default: // Without this, you see a WARNING.
    print(aColor); // 'Color.blue'
}列挙型値の名前(たとえば、Color.blueからの'blue')にアクセスする必要がある場合は、.nameプロパティを使用します。
dart
print(Color.blue.name); // 'blue'通常のオブジェクトでメンバーにアクセスするのと同じように、列挙型値のメンバーにアクセスできます。
dart
print(Vehicle.car.carbonFootprint);