【问题标题】:How to handle future enum values in Dart 2.17+如何在 Dart 2.17+ 中处理未来的枚举值
【发布时间】: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) 生成为动态枚举值?

【问题讨论】:

    标签: dart enums


    【解决方案1】:

    所以我的问题 #1:是否有更好/更聪明(又名方便)的方式来处理未来值?

    我认为您可以通过将 fromNumbernumber 的定义移动到枚举本身而不是作为扩展来改进您的枚举。

    此外,我认为您可以改进fromNumbernumber 的实现。

    对于number,枚举已经有一个名为index 的getter,它返回的值与您想要的相同,因此您可以在number 方法中简单地返回index

    对于fromNumber,我们可以把它变成一个工厂构造函数,因为所有的枚举都有一个静态的values列表(它包含了所有枚举值按照它们定义的特定顺序),我们可以通过索引到values 列表。对于任何无效索引,我们将返回 unknown

    numberfromNumber 进行这些更改的好处是,当您添加另一个枚举值时,您将不再需要更新这些方法。

    更新后的枚举如下:

    enum BatteryLiveDataProtocol {
      unknown, // 0
      rs485, // 1
      ttl, // 2
      canbus, // 3
      uart, //4
      ;
    
      factory BatteryLiveDataProtocol.fromNumber(int number) =>
          number >= values.length || number < 0 ? unknown : values[number];
    
      int get number => index;
    }
    

    问题 #2:其他语言处理未来的枚举(例如在 Swift 中):有没有办法将 unknown(actualValue) 生成为动态枚举值?

    不,dart 的增强枚举不像 swift 枚举那样工作,dart 中的枚举更接近于 java 枚举。 Swift 将此功能称为 associated values,但 dart 枚举没有此功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 2019-08-23
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      相关资源
      最近更新 更多