Swift中能否将枚举的多个case分组表示为另一个case?
实现方案
该需求完全可以实现,以下是两种主流可行方案:
方案1:新增分组枚举 + 原枚举关联分组属性(最符合你预期写法)
这个方案完全可以实现你示例中的调用方式,只需给原Device枚举扩展一个分组映射属性即可:
首先保留你定义的两个枚举:
enum Device { case iPhone_13Pro, iPhone_12Pro case iPadPro_129, iPadPro_11 } enum DeviceGroup { case iPhones case iPads }
然后给Device添加分组映射的计算属性:
extension Device { var group: DeviceGroup { switch self { case .iPhone_13Pro, .iPhone_12Pro: return .iPhones case .iPadPro_129, .iPadPro_11: return .iPads } } }
最终调用时就可以直接按你期望的写法使用:
let device: Device = .iPhone_13Pro switch device.group { case .iPhones: print("These are iPhones") case .iPads: print("These are iPads") }
后续新增设备枚举值时,只需要在group属性的switch中补充对应分组即可,所有用到分组判断的地方无需修改,维护成本极低。
方案2:无需额外定义分组枚举,直接扩展判断属性
如果你不需要独立的分组枚举,也可以直接给Device扩展分类判断的Bool属性:
extension Device { var isiPhone: Bool { switch self { case .iPhone_13Pro, .iPhone_12Pro: return true default: return false } } var isiPad: Bool { !isiPhone } }
使用时可以通过模式匹配的where子句实现无罗列调用:
let device: Device = .iPadPro_11 switch device { case _ where device.isiPhone: print("These are iPhones") case _ where device.isiPad: print("These are iPads") }
内容的提问来源于stack exchange,提问作者sjk.27
相关产品推荐
相关产品推荐

