You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:45:06