如何从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
相关产品推荐
相关产品推荐

