【发布时间】:2022-07-07 00:15:54
【问题描述】:
我的应用程序连接到定制的外围设备,并从中提取一些值作为整数,我想将其转换为枚举以简化应用程序代码。
随着硬件的不断发展,新的价值将会出现,这是众所周知的事实。
在我的 Flutter 应用程序中,我通过枚举扩展处理已知值(在编写应用程序时),提供一个“未知”值,如下所示:
// 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;
}
}
如您所见,此代码非常方便地支持未来版本:
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;
}
但是我该如何处理未来的枚举值呢?
我可以在任何我想将 int 转换为 enum 的地方做到这一点:
BatteryLiveDataProtocol p;
try {
const futureValue = 13;
p = BatteryLiveDataProtocol(futureValue);
} catch(e) {
p = BatteryLiveDataProtocol.unknown;
}
但这很麻烦,不是吗?有可能自己提供 const BatteryLiveDataProtocol(this.value); 的正文会很酷。
[UPDATE] 顺便说一句,不确定是否足够清楚,但仍然可以在增强的枚举中创建静态函数,如下所示:
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:是否有更好/更聪明(又名方便)的方式来处理未来值?
问题 #2:其他语言处理未来枚举(例如在 Swift 中):有没有办法将 unknown(actualValue) 生成为动态枚举值?
【问题讨论】: