我猜不同的笑點,代表不同的智力水平。
前言
今年四月初寫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
以后就行了,具體為啥沒有咋研究。