Swift使用Codable解码时报keyNotFound找不到type字段错误如何解决
错误原因
你自定义实现的encode(to:)方法仅编码了data字段,没有将type字段写入编码容器,导致解码时无法找到对应的type键,直接抛出keyNotFound错误。此外你的编码逻辑还遗漏了WorkoutsData中.challenge分支的处理,会导致该类型数据编码异常。
修复方案
替换你现有的encode(to:)实现,补全type字段编码和遗漏的分支处理即可:
extension OverviewWorkout { func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) // 编码type字段 try container.encode(type, forKey: .type) switch data { case .workout(let workout): try container.encode(workout, forKey: .data) case .challenge(let workout): try container.encode(workout, forKey: .data) case .bodyArea(let bodyarea): try container.encode(bodyarea, forKey: .data) case .title(let title): try container.encode(title, forKey: .data) case .coach(let coach): try container.encode(coach, forKey: .data) case .trainer(let trainer): try container.encode(trainer, forKey: .data) case .group(let group): try container.encode(group, forKey: .data) } } }
额外注意事项
- 如果你是解码第三方返回的JSON数据而非自己编码生成的数据,请确认返回的JSON结构中确实存在
type字段,且字段值的大小写、拼写和你定义的WorkoutType枚举的原始值完全匹配 - 如果
type字段的实际键名和你定义的CodingKeys不一致,可以修改CodingKeys的原始值做映射,比如后端返回键名为workout_type时,修改为case type = "workout_type"即可
内容的提问来源于stack exchange,提问作者user9261559
相关产品推荐
相关产品推荐

