在Dart中提供枚举之前,我写了一些繁琐且难以维护的代码来模拟枚举,现在想要简化它。我需要将枚举的值作为字符串获取,例如可以用Java完成,但不能。
例如,当我想要的是“星期一”时,小测试代码片段在每种情况下返回'day.MONDAY'
enum day {MONDAY, TUESDAY}
print( 'Today is $day.MONDAY');
print( 'Today is $day.MONDAY.toString()');
我是否更正为了得到'星期一'我需要解析字符串?
可悲的是,你是正确的,toString方法返回"day.MONDAY"
,而不是更有用的"MONDAY"
。您可以将其余字符串作为:
day theDay = day.MONDAY;
print("${theDay.toString().substring(theDay.toString().indexOf('.')+1)}");
诚然,这很方便。
如果要迭代所有值,可以使用day.values
来完成:
for (day theDay in day.values) {
print(theDay);
}
比特短一点:
String day = theDay.toString().split('.').last;
有一个更优雅的解决方案:
enum SomeStatus {
element1,
element2,
element3,
element4,
}
const Map<SomeStatus, String> SomeStatusName = {
SomeStatus.element1: "Element 1",
SomeStatus.element2: "Element 2",
SomeStatus.element3: "Element 3",
SomeStatus.element4: "Element 4",
};
print(SomeStatusName[SomeStatus.element2]) // prints: "Element 2"
获取枚举名称的最简单方法是flutter / foundation.dart中的标准方法
describeEnum(enumObject)
enum Day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
void validateDescribeEnum() {
assert(Day.monday.toString() == 'Day.monday');
assert(describeEnum(Day.monday) == 'monday');
}
我使用如下结构:
class Strings {
static const angry = "Dammit!";
static const happy = "Yay!";
static const sad = "QQ";
}
我的方法并没有根本不同,但在某些情况下可能稍微方便一些:
enum Day {
monday,
tuesday,
}
String dayToString(Day d) {
return '$d'.split('.').last;
}
在Dart中,你不能自定义枚举的toString
方法,所以我认为这个辅助函数解决方法是必要的,它是最好的方法之一。如果您想在这种情况下更正确,可以将返回的字符串的第一个字母设为大写。
您还可以添加dayFromString
功能
Day dayFromString(String s) {
return Day.values.firstWhere((v) => dayToString(v) == s);
}
用法示例:
void main() {
Day today = Day.monday;
print('Today is: ${dayToString(today)}');
Day tomorrow = dayFromString("tuesday");
print(tomorrow is Day);
}
我使用这两个函数来获取枚举值的名称,反之,使用名称来获取枚举值:
String enumValueToString(Object o) => o.toString().split('.').last;
T enumValueFromString<T>(String key, List<T> values) =>
values.firstWhere((v) => key == enumValueToString(v), orElse: () => null);
用法示例:
enum Fruits {avocado, banana, orange}
...
final banana = enumValueFromString<Fruits>('banana', Fruits.values);
print(enumValueToString(banana)); // prints: "banana"
我得到了这个,我做了一个包:
https://pub.dev/packages/enum_to_string
还有一个方便的功能,需要enum.ValueOne
并解析为“Value one
”
它是一个简单的小库,但它的单元测试,我欢迎任何边缘情况的添加。