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

如何仅检查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),只需要两步:

  1. 新增子枚举JumpEvent和对应的顶层casecase jumping(event: JumpEvent)
  2. 在isSameCategory里加对应的判断(比如元组模式加(.jumping, .jumping),或者新增一个if case .jumping的判断)

完全不用修改原有逻辑,维护成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:36