目录

枚举类型

枚举类型,通常称为 枚举 或_enums_,是一种特殊的类,用于表示固定数量的常量值。

声明简单的枚举

#

要声明一个简单的枚举类型,请使用 enum 关键字并列出您要枚举的值:

dart
enum Color { red, green, blue }

声明增强的枚举

#

Dart 还允许枚举声明声明具有字段、方法和常量构造函数的类,这些类仅限于固定数量的已知常量实例。

要声明增强的枚举,请遵循类似于普通 的语法,但有一些额外的要求:

  • 实例变量必须是 final ,包括由 mixins 添加的那些。
  • 所有 生成式构造函数 必须是常量。
  • 工厂构造函数 只能返回一个已知的固定枚举实例。
  • 不能扩展其他类,因为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('你最喜欢的颜色是蓝色!');
}

枚举中的每个值都有一个 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('像玫瑰一样红!');
  case Color.green:
    print('像草一样绿!');
  default: // 没有这个,你会看到一个警告。
    print(aColor); // 'Color.blue'
}

如果您需要访问枚举值的名称,例如从 Color.blue 获取 'blue' ,请使用 .name 属性:

dart
print(Color.blue.name); // 'blue'

您可以像在普通对象上一样访问枚举值的成员:

dart
print(Vehicle.car.carbonFootprint);