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

使用嵌套枚举实现问题钻取的结构设计与访问问题求助

嵌套枚举在问题钻取场景的正确用法及问题修复

嵌套枚举完全适合这种层级化的问题钻取场景,能清晰表达问题间的依赖关系。你的问题出在对枚举关联值的使用逻辑和switch匹配顺序的理解上,以下是具体修复方案:

问题1:Switch Case被覆盖的修复

Swift的switch是从上到下匹配的,宽泛的通配符case(比如.techQuestion(_))会优先匹配所有关联TechQuestionStep的情况,导致后面的具体case永远无法执行。解决方法是把最具体的case放在最前面,宽泛的case放在最后:

func getStepTitle(step: SubmissionSteps) -> String {
    switch step {
    case .techQuestion(.website(.yesStreaming(.startTime(.endTime)))):
        return "End Time"
    case .techQuestion(.website(.yesStreaming(.startTime(_)))):
        return "Start Time"
    case .techQuestion(.website(.yesStreaming(_))):
        return "Yes Streaming"
    case .techQuestion(.website(.noStreaming)):
        return "No Streaming"
    case .techQuestion(.website(_)):
        return "Website"
    case .techQuestion(.app):
        return "App"
    case .techQuestion(.password):
        return "Password"
    case .techQuestion(.other):
        return "Other"
    case .techQuestion(_):
        return "Tech Question"
    }
}

问题2:currentStep赋值错误的修复

SubmissionSteps.techQuestion是带关联值的case,必须传入一个TechQuestionStep类型的具体值才能完成初始化。如果想把第一个步骤设为「Tech Question」入口,需要调整枚举结构,把顶层步骤单独拆出来:

enum SubmissionSteps {
    // 顶层初始步骤
    case techQuestion
    // 技术问题下的子步骤
    case techSubStep(TechQuestionStep)
    
    enum TechQuestionStep {
        case website(WebsiteStep), app, password, other
        
        enum WebsiteStep {
            case yesStreaming(YesStreamingStep), noStreaming
            
            enum YesStreamingStep {
                case startTime(StartTimeStep)
                
                enum StartTimeStep {
                    case endTime
                }
            }
        }
    }
}

此时就能正常设置初始步骤:

func showFirstStep() {
    currentStep = .techQuestion
}

更优雅的实现:给枚举添加title属性

为了避免冗长的switch逻辑,可给每个嵌套枚举添加title计算属性,通过递归获取对应层级的标题:

enum SubmissionSteps {
    case techQuestion
    case techSubStep(TechQuestionStep)
    
    var title: String {
        switch self {
        case .techQuestion:
            return "Tech Question"
        case .techSubStep(let subStep):
            return subStep.title
        }
    }
    
    enum TechQuestionStep {
        case website(WebsiteStep), app, password, other
        
        var title: String {
            switch self {
            case .website(let subStep):
                return subStep.title
            case .app:
                return "App"
            case .password:
                return "Password"
            case .other:
                return "Other"
            }
        }
        
        enum WebsiteStep {
            case yesStreaming(YesStreamingStep), noStreaming
            
            var title: String {
                switch self {
                case .yesStreaming(let subStep):
                    return subStep.title
                case .noStreaming:
                    return "No Streaming"
                }
            }
            
            enum YesStreamingStep {
                case startTime(StartTimeStep)
                
                var title: String {
                    switch self {
                    case .startTime(let subStep):
                        return subStep.title
                    }
                }
                
                enum StartTimeStep {
                    case endTime
                    
                    var title: String {
                        return "End Time"
                    }
                }
            }
        }
    }
}

使用时直接访问step.title即可,无需单独写getStepTitle函数:

let endTimeStep = SubmissionSteps.techSubStep(.website(.yesStreaming(.startTime(.endTime))))
print(endTimeStep.title) // 输出 "End Time"

核心总结

嵌套枚举适配问题钻取场景的关键注意点:

  • Switch匹配必须遵循从最具体到最宽泛的顺序
  • 带关联值的枚举case必须传入对应关联值才能完成初始化
  • 通过给嵌套枚举添加计算属性,可更优雅地管理层级化的标题信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:13:19