一、简介
枚举类型,通常称为enumerations或enums,是一种特殊的类,用于表示固定数量的常量值。
所有枚举都会自动继承Enum类。它们也是密封的,这意味着它们不能被子类化、实现、混合或以其他方式显式实例化。
抽象类和 mixin 可以实现或继承Enum,但除非它们随后由 enum 声明实现或混合到 enum 声明中,否则没有对象可以实现该类或 mixin 的类型。
二、声明简单的枚举
要声明一个简单的枚举类型,请使用enum
关键字并列出要枚举的值:
enum Color { red, green, blue }
三、声明增强的枚举
Dart 还允许枚举声明来声明具有字段、方法和 const 构造函数的类,这些构造函数仅限于固定数量的已知常量实例。
要声明增强型枚举,请遵循类似于普通类的语法,但有一些额外要求:
-
实例变量必须是
final
,包括那些由mixins添加的。 -
所有生成构造函数都必须是常量。
-
工厂构造函数只能返回固定的已知枚举实例之一。
-
没有其他类可以Enum自动扩展。
-
index
,hashCode
, 等式运算符不能被重写。 -
values
不能在枚举中声明名为的成员,因为它会与自动生成的静态values
getter 冲突。 -
枚举的所有实例都必须在声明的开头声明,并且必须至少声明一个实例。
下面是一个示例,它声明了一个具有多个实例、实例变量、一个 getter 和一个已实现接口的增强型枚举:
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();
@override
int compareTo(Vehicle other) => carbonFootprint - other.carbonFootprint;
}
增强型枚举需要至少 dart-2.17版本库
四、使用枚举
像访问任何其他静态变量一样访问枚举值:
final favoriteColor = Color.blue;
if (favoriteColor == Color.blue) {
print('Your favorite color is blue!');
}
枚举中的每个值都有一个index
属性,它返回值在枚举声明中从零开始的位置。例如,第一个值的索引为 0,第二个值的索引为 1。
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);
要获取所有枚举值的列表,请使用枚举的values
常量。
List<Color> colors = Color.values;
assert(colors[2] == Color.blue);
您可以在switch 语句中使用枚举,如果您不处理所有枚举值,则会收到警告:
var aColor = Color.blue;
switch (aColor) {
case Color.red:
print('Red as roses!');
break;
case Color.green:
print('Green as grass!');
break;
default: // Without this, you see a WARNING.
print(aColor); // 'Color.blue'
}
如果您需要访问枚举值的名称,例如blue来自Color.blue
,请使用.name`属性:
print(Color.blue.name); // 'blue'
五、总结
1.本文为翻译官方文档
2.增强枚举
3.index、values和name属性