點燈坊

失くすものさえない今が強くなるチャンスよ

Enum 搭配 String

Sam Xiao's Avatar 2024-12-09

Enum 理論上都是搭配 int,若要搭配 String,則要搭配 Extension

Version

Dart 3.5.4

Enum

device_type_enum.dart

enum DeviceTypeEnum {
  gw, // 主機
  cam, // 攝影機
  sensor, // 感測器
}

extension DeviceTypeEnumEx on DeviceTypeEnum {
  String get code {
    switch (this) {
      case DeviceTypeEnum.gw:
        return "GW";
      case DeviceTypeEnum.cam:
        return "CAM";
      case DeviceTypeEnum.sensor:
        return "Sensor";
      default:
        return "GW";
    }
  }

  static DeviceTypeEnum? fromCode(String code) {
    switch (code) {
      case "GW":
        return DeviceTypeEnum.gw;
      case "CAM":
        return DeviceTypeEnum.cam;
      case "Sensor":
        return DeviceTypeEnum.sensor;
      default:
        return null;
    }
  }
}

Line 1

enum DeviceTypeEnum {
  gw, // 主機
  cam, // 攝影機
  sensor, // 感測器
}
  • enum:一樣使用 enum 定義 DeviceTypeEnum,此時 gwcamsensor 仍定義為 012

Line 7

extension DeviceTypeEnumEx on DeviceTypeEnum {
}
  • extension:使用 extensionDeviceTypeEnum 為基礎定義 DeviceTypeEnumEx

Line 8

String get code {
  switch (this) {
    case DeviceTypeEnum.gw:
      return "GW";
    case DeviceTypeEnum.cam:
      return "CAM";
    case DeviceTypeEnum.sensor:
      return "Sensor";
    default:
      return "GW";
  }
}
  • 定義 code getter 將 EnumString

Line 21

static DeviceTypeEnum? fromCode(String code) {
  switch (code) {
    case "GW":
      return DeviceTypeEnum.gw;
    case "CAM":
      return DeviceTypeEnum.cam;
    case "Sensor":
      return DeviceTypeEnum.sensor;
    default:
      return null;
  }
}
  • 定義 fromCode()StringEnum

Enum to String

import "device_type_enum.dart";

void main() {
  var result = DeviceTypeEnum.gw;
  print('result: ${result.code}');
}
  • result:為 DeviceTypeEnum 型別
  • code:使用 code getter 將 Enum 轉 String

String to Enum

import "device_type_enum.dart";

void main() {
  var code = 'GW';

  DeviceTypeEnum? deviceType = DeviceTypeEnumEx.fromCode(code);

  if (deviceType == null) {
    print('No matching device type found');
  } else {
    print('deviceType: ${deviceType.name}');
  }
}
  • fromCode():使用 DeviceTypeEnumExfromCode() String 轉成 Enum
    • null:轉型失敗,並非所允許的 String
    • name:由 name 取得 Enum 的 key

Conclusion

  • 透過 Extension 則 Enum 也可搭配 String
  • 由 Extension 提供 code getter 將 Enum 轉 String
  • 由 Extesnsio 提供 fromCode 將 String 轉 Enum