Swift中如何根据数值范围将整数转换为对应枚举类型
解决方案
基础实现(兼容原枚举定义,支持直接构造器调用)
无需修改原有Position枚举的定义,直接在扩展中新增自定义构造器即可实现你期望的类型转换写法:
extension Position { /// 支持传入可空Int64直接构造Position public init(_ val: Int64?) { switch val { case .some(..<8): self = .Top case .some(8...): self = .Bottom default: self = .Both } } }
实现后即可直接使用你期望的调用方式:
let readPosition = Position(controller.readVal())
原有基于rawValue的枚举初始化、取值逻辑完全不受影响,可完美兼容旧代码。
多应用自定义转换扩展方案
因为Swift支持跨模块扩展枚举,不同应用无需修改公共的Position定义,只需在自己的模块中新增扩展即可实现自定义转换规则,为了避免不同规则的构造器冲突,可以给构造器增加自定义标签区分:
// 示例:App A 自定义的转换规则 extension Position { init(appA_input: Int64?) { // 此处填写App A专属的转换逻辑 switch appA_input { case .some(..<16): self = .Top case .some(16...64): self = .Bottom default: self = .Both } } } // App A调用示例 let appAPos = Position(appA_input: controller.readVal())
如果需要更规范的规则约束,也可以在公共库定义转换协议,各应用遵循协议实现自己的转换逻辑即可:
// 公共库定义转换协议 public protocol PositionConverter { func convertToPosition() -> Position } // App 自行实现协议 extension Int64: PositionConverter { public func convertToPosition() -> Position { // 自定义转换逻辑 } } // 调用示例 let readPosition = controller.readVal().convertToPosition()
注意点
你原有实现中的case .some(1), .some(..<8)存在冗余判断,数值1已经包含在..<8的范围中,可以直接删除重复条件简化逻辑。
内容的提问来源于stack exchange,提问作者ATL_DEV
相关产品推荐
相关产品推荐

