Swift嵌套枚举赋值报错:无法将子枚举存入父枚举变量如何解决?
Swift嵌套枚举赋值错误问题解析
问题代码
class SetupVC: UIViewController { var isBasic:Bool = true var currentStep:SetupStep? var currentStepIndex:Int = 0 enum SetupStep { case basic(BasicStep), advanced(AdvancedStep) enum BasicStep: CaseIterable, Equatable { case one, two, three } enum AdvancedStep: CaseIterable, Equatable { case one, two, three } } override func viewDidLoad() { super.viewDidLoad() if isBasic == true { currentStep = SetupStep.BasicStep.allCases[currentStepIndex] } else { currentStep = SetupStep.AdvancedStep.allCases[currentStepIndex] } } }
报错信息
Cannot assign value of type 'SetupVC.SetupStep.BasicStep' to type 'SetupVC.SetupStep?'
问题根源
你混淆了带关联值的枚举成员和嵌套枚举本身。SetupStep是一个带关联值的枚举:
case basic(BasicStep)是SetupStep的一个枚举成员,它需要关联一个BasicStep类型的值作为附加数据- 直接把
BasicStep类型的实例赋值给SetupStep?类型的变量,属于类型不匹配,自然会报错
修正后的代码
class SetupVC: UIViewController { var isBasic:Bool = true var currentStep:SetupStep? var currentStepIndex:Int = 0 enum SetupStep { case basic(BasicStep), advanced(AdvancedStep) enum BasicStep: CaseIterable, Equatable { case one, two, three } enum AdvancedStep: CaseIterable, Equatable { case one, two, three } } override func viewDidLoad() { super.viewDidLoad() if isBasic { // 先获取BasicStep实例,再包装成SetupStep.basic成员 let targetBasicStep = SetupStep.BasicStep.allCases[currentStepIndex] currentStep = .basic(targetBasicStep) } else { // 先获取AdvancedStep实例,再包装成SetupStep.advanced成员 let targetAdvancedStep = SetupStep.AdvancedStep.allCases[currentStepIndex] currentStep = .advanced(targetAdvancedStep) } } }
补充说明
SetupStep的设计逻辑是:用外层枚举的不同成员(basic/advanced)来区分流程类型,每个成员携带对应嵌套枚举的具体步骤值。必须通过.basic(xxx)或.advanced(xxx)的语法,把嵌套枚举的实例包装成外层枚举的实例,才能完成类型匹配的赋值。
内容的提问来源于stack exchange,提问作者Alexander Ritter
相关产品推荐
相关产品推荐

