文章

枚举enum

枚举enum

枚举enum

枚举enum

在 Dart 中,从版本 2.17 开始,枚举(enum)类型得到了增强,支持定义成员变量、构造函数、方法等,这让枚举的使用更加灵活且功能更强大。以下是一些关于如何在 Dart 中使用枚举的高级用法,包括如何为枚举添加属性和方法。

定义枚举及其属性

你可以为枚举定义属性和构造函数。这使得每个枚举值可以携带更多的信息。

1
2
3
4
5
6
7
8
9
enum Season {
  spring('春'),
  summer('夏'),
  autumn('秋'),
  winter('冬');

  final String name;
  const Season(this.name);
}

在这个例子中,Season 枚举代表了一年中的四个季节,每个季节都有对应的中文名称作为属性。

访问枚举属性

既然枚举可以有属性,那么你可以像访问对象的属性一样访问枚举的属性。

1
2
3
4
void main() {
  final season = Season.spring;
  print(season.name); // 输出:春
}

在枚举中定义方法

枚举还支持定义方法。这意味着你可以在枚举内部添加功能性的方法,以增强枚举的功能性。

1
2
3
4
5
6
7
8
9
10
11
12
13
enum Season {
  spring('春'),
  summer('夏'),
  autumn('秋'),
  winter('冬');

  final String name;
  const Season(this.name);

  void describe() {
    print('现在是$name季节。');
  }
}

你可以这样调用枚举的方法:

1
2
3
4
void main() {
  final season = Season.spring;
  season.describe(); // 输出:现在是春季节。
}

枚举的扩展方法

如果你想为现有的枚举添加方法,但又不想修改枚举本身,可以使用扩展(extension)来为枚举添加新的方法。

使用switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum Season {
  spring, summer, autumn, winter;
}

extension SeasonExtension on Season {
  String get name {
    switch (this) {
      case Season.spring:
        return '春';
      case Season.summer:
        return '夏';
      case Season.autumn:
        return '秋';
      case Season.winter:
        return '冬';
    }
  }

  void describe() {
    print('现在是$name季节。');
  }
}

使用扩展为枚举添加方法后,你可以像使用枚举内部定义的方法一样使用它们:

1
2
3
4
5
void main() {
  final season = Season.spring;
  print(season.name); // 输出:春
  season.describe(); // 输出:现在是春季节。
}

优化后:

1
2
3
4
5
6
7
enum Season {
  spring, summer, autumn, winter;
}

extension SeasonExtension on Season {
  String get name => ['春', '夏', '秋', '冬'][index] + '季节';
}

使用扩展为枚举添加方法后,你可以像使用枚举内部定义的方法一样使用它们:

1
2
3
void main() {
  print('现在是: ${Season.summer.name}'); // 现在是: 夏季节
}

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum Month { jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec }

extension MonthExtension on Month {
  int get value => this.index + 1;

  String get cn => ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"][this.index] + "月";

  String get eng => ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][this.index];
}

void main() {
  final m = Month.jan;
  print('value: ${m.value},cn: ${m.cn},eng: ${m.eng}'); // value: 1,cn: 一月,eng: Jan
}
本文由作者按照 CC BY 4.0 进行授权