我猜不同的笑点,代表不同的智力水平。
前言
今年四月初写Flutter
的时候,觉得里面的枚举着实有点难受,先不说Swift
了,和oc
相比都差太多,最起码oc
能赋值。不知怎的刚才突发奇想,仔细研究一下Flutter
枚举,没想到还有真有好用的写法。
正文
如果枚举值对应的值是从0开始递增的,那就太好了,直接下面写就行了。
enum RoomType {
/// 游戏
game,
/// 歌厅
song,
/// 直播
live,
}
使用的时候直接用对应的index
就ok,例:
int roomType = RoomType.song.index; /// 值为1
但是,如果枚举的值不是从0开始的怎么办?如果枚举值对应的是字符串呢?没关系,写扩展。
-
枚举扩展
extension RoomTypeValue on RoomType {
String get value {
String _value = '';
switch (this) {
case RoomType.game:
_value = '1';
break;
case RoomType.song:
_value = '3';
break;
case RoomType.live:
_value = '5';
break;
default:
}
return _value;
}
}
使用:
String roomType = RoomType.song.value; /// 值为 '3'
可以看出,如果想对应其他的整型的值,就再写一个get
方法,然后再用switch case
即可,对于前期学习的我就凑合着用了,但内心还是觉得这种写法有点丑陋。
万幸的是,随着 2022 年 5 月在 Google I/O
上发布Flutter 3.0
,我们不必再依赖这些令人长长的代码了。来看一下用最新写法替代上面的扩展吧。
-
枚举新写法
enum RoomType {
/// 游戏
game('1'),
/// 歌厅
song('3'),
/// 直播
live('5');
final String value;
const RoomType(this.value);
}
使用:
String roomType = RoomType.song.value; /// 值为 '3'
简洁!好用!
有的小伙伴会说,如果还对应整型值呢?没关系,往下看:
enum RoomType {
/// 游戏
game('1', 1),
/// 歌厅
song('3', 3),
/// 直播
live('5', 5);
final String value;
final int number;
const RoomType(this.value, this.number);
}
使用:
String roomType = RoomType.song.value; /// 值为 '3'
int roomType = RoomType.song.number; /// 值为 3
由此可见,想映射啥就映射啥,想映射几个就映射几个,有种鸟枪换炮的感觉,恐怖如斯。
后记
我查阅的资料的说的是3.0
以后可以使用,我用的Dart
版本是3.0.5
,但是实测只要是2.17.0
以后就行了,具体为啥没有咋研究。