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

如何从Swift整数类型枚举中获取最小与最大整数值?

实现方案

针对你这个遵循Int和CaseIterable协议的枚举,有几种简洁的方式获取最小/最大整数值,无需手动遍历比较:

方法1:扩展Comparable协议(最贴近你期望的写法)

你的枚举默认没有遵循Comparable,所以直接调用allCases.min/max会报错。给枚举扩展Comparable后,就能按你预想的方式编写代码:

private enum PreloadedArrayDataIndex: Int, CaseIterable {
    case Previous = 0
    case Current = 1
    case Future = 2
}

// 扩展Comparable,基于rawValue实现比较逻辑
extension PreloadedArrayDataIndex: Comparable {
    static func < (lhs: Self, rhs: Self) -> Bool {
        lhs.rawValue < rhs.rawValue
    }
}

// 直接获取最小/最大枚举值,再提取rawValue
let minValue = PreloadedArrayDataIndex.allCases.min!.rawValue // 0
let maxValue = PreloadedArrayDataIndex.allCases.max!.rawValue // 2

这里用!是因为CaseIterable保证枚举至少包含一个case,所以min/max不会返回nil,可以安全强制解包。

方法2:映射到rawValue数组后取极值(无需扩展)

如果不想给枚举添加扩展,直接通过map将所有枚举值转换为rawValue数组,再调用min()/max()即可:

let rawValues = PreloadedArrayDataIndex.allCases.map(\.rawValue)
let minValue = rawValues.min()! // 0
let maxValue = rawValues.max()! // 2

这种写法更轻量化,适合临时使用的场景。

方法3:直接用min(by:)/max(by:)比较rawValue

也可以直接在allCases上通过闭包比较rawValue,省去数组映射步骤:

let minValue = PreloadedArrayDataIndex.allCases.min { $0.rawValue < $1.rawValue }?.rawValue ?? 0
let maxValue = PreloadedArrayDataIndex.allCases.max { $0.rawValue < $1.rawValue }?.rawValue ?? 2

这里的默认值(?? 0/?? 2)是兜底逻辑,实际因枚举非空不会触发。

内容的提问来源于stack exchange,提问作者mikemgg123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:20:33