我的应用程序连接到一个定制的外围设备,并从中提取一些值作为int,我想将其转换为enum以简化应用程序代码.
随着硬件的不断发展,众所周知,新的价值观将会出现.
在我的Flatter应用程序中,我通过枚举扩展处理已知值(在编写应用程序时),提供如下"未知"值:
// Battery live data originator protocol
enum BatteryLiveDataProtocol {
unknown, // 0
rs485, // 1
ttl, // 2
canbus, // 3
uart, //4
;
}
extension BatteryLiveDataProtocolExtension on BatteryLiveDataProtocol {
/// Build the enum out of the int number
static BatteryLiveDataProtocol fromNumber(int number) {
switch (number) {
case 1:
return ttl;
case 2:
return rs485;
case 3:
return canbus;
case 0:
default:
return unknown;
}
}
/// Returns the number correpsonding to the enum
int get number {
switch (this) {
case rs485:
return 1;
case ttl:
return 2;
case canbus:
return 3;
case unknown:
default:
return 0;
}
}
如您所见,此代码非常方便地支持future 版本:
const futureValue = 13;
final p = BatteryLiveDataProtocol.fromNumber(futureValue);
自从推出Dart 2.17(Flutter 3)以来,我想利用增强的枚举,如下所示:
// Battery live data originato protocol
enum BatteryLiveDataProtocol {
unknown(),
rs485(1),
ttl(2),
canbus(3),
uart(4),
;
const BatteryLiveDataProtocol(this.value);
final num value;
}
但是,我如何处理future 的枚举值呢?
我可以这样做,无论我想在哪里将int转换为enum:
BatteryLiveDataProtocol p;
try {
const futureValue = 13;
p = BatteryLiveDataProtocol(futureValue);
} catch(e) {
p = BatteryLiveDataProtocol.unknown;
}
但这很麻烦,不是吗?我们有可能自己提供 const BatteryLiveDataProtocol(this.value);
具尸体,这太酷了.
[更新]顺便说一句,不确定它是否足够清晰,但仍然可以在增强的枚举中创建静态函数,如下所示:
static BatteryLiveDataProtocol fromValue(int v) {
BatteryLiveDataProtocol p;
try {
p = BatteryLiveDataProtocol[v];
} catch (e) {
p = unknown;
}
return p;
}
并按如下方式使用:
const futureValue = 13;
final p = BatteryLiveDataProtocol.fromValue(futureValue);
// Makes p being set to "unknown".
那么,我的问题#1:有没有更好/更聪明(即方便)的方法来处理future 价值?
问题#2:其他语言处理future 的枚举(例如在Swift中):有没有办法生成unknown(actualValue)
作为动态枚举值?