如何仅检查Swift嵌套枚举的外层枚举是否相等?
用嵌套枚举实现同一分类判断(避免冗长Switch)
嘿,你的嵌套枚举思路真的很赞——用顶层枚举把不同运动分类的子枚举包起来,从根源上避免了非法状态,这个设计非常合理!要实现isSameCategory方法,完全不用写庞大的switch语句,用模式匹配就能轻松搞定,而且扩展性还强。
这里给你两种简洁的实现方式,都能满足需求:
方式一:元组模式匹配(代码更紧凑)
直接通过元组匹配两个实例的顶层case,同一分类的case放在一组:
enum SportsEvent { enum RunningEvent { case sprint, marathon } enum ThrowingEvent { case hammer, javelin, discus } case running(event: RunningEvent) case throwing(event: ThrowingEvent) func isSameCategory(as other: SportsEvent) -> Bool { switch (self, other) { // 匹配同一分类的组合 case (.running, .running), (.throwing, .throwing): return true default: return false } } }
方式二:多个if case判断(逻辑更直观)
如果觉得switch元组有点绕,用多个if case分别判断每个分类,可读性更高:
enum SportsEvent { // 子枚举和case定义和上面一致 enum RunningEvent { case sprint, marathon } enum ThrowingEvent { case hammer, javelin, discus } case running(event: RunningEvent) case throwing(event: ThrowingEvent) func isSameCategory(as other: SportsEvent) -> Bool { // 判断是否都是跑步类 if case .running = self, case .running = other { return true } // 判断是否都是投掷类 if case .throwing = self, case .throwing = other { return true } // 不属于同一分类 return false } }
测试验证
用你给出的测试代码验证,结果完全符合预期:
let sprint = SportsEvent.running(event: .sprint) let javelin = SportsEvent.throwing(event: .javelin) let hammer = SportsEvent.throwing(event: .hammer) print(sprint.isSameCategory(as: javelin)) // 输出 false print(hammer.isSameCategory(as: javelin)) // 输出 true
扩展性说明
以后如果要新增运动分类(比如跳跃类JumpEvent),只需要两步:
- 新增子枚举
JumpEvent和对应的顶层casecase jumping(event: JumpEvent) - 在
isSameCategory里加对应的判断(比如元组模式加(.jumping, .jumping),或者新增一个if case .jumping的判断)
完全不用修改原有逻辑,维护成本极低。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

