內容

列舉型別,通常稱為列舉enum,是一種特殊類別,用於表示固定數量的常數值。

宣告簡單列舉

#

若要宣告一個簡單的列舉類型,請使用 enum 關鍵字並列出您要列舉的值

dart
enum Color { red, green, blue }

宣告增強列舉

#

Dart 也允許列舉宣告宣告具有欄位、方法和常數建構函式的類別,這些類別僅限於固定數量的已知常數實例。

若要宣告一個增強的列舉,請遵循類似於一般 類別 的語法,但有一些額外的需求

  • 實例變數必須為 final,包括由 混合類別 新增的變數。
  • 所有 產生式建構函式 都必須是常數。
  • 工廠建構函式 只能傳回一個固定的已知列舉實例。
  • 沒有其他類別可以延伸為 Enum,因為它會自動延伸。
  • 不能覆寫 indexhashCode、等號運算子 ==
  • 列舉中不能宣告名為 values 的成員,因為它會與自動產生的靜態 values getter 衝突。
  • 列舉的所有實例都必須在宣告的開頭宣告,且至少必須宣告一個實例。

增強列舉中的實例方法可以使用 this 來參照目前的列舉值。

以下是一個範例,宣告一個具有多個實例、實例變數、getter 和已實作介面的增強列舉

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 getter,它會傳回列舉宣告中該值的零為基礎位置。例如,第一個值的索引為 0,第二個值的索引為 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);