SwiftUI使用ForEach处理未遵循Identifiable的Codable数组问题
问题根因
你之前添加UUID属性后解码失败,是因为Swift默认的Codable自动合成逻辑会把所有存储属性纳入编解码流程,API返回的JSON中不存在id字段,解码时会抛出字段缺失的错误。
解决方案
推荐按优先级选择以下方案:
方案1:复用已有ID,无需新增属性(最优)
你的IncidentDetails本身已经带id字段,直接扩展IncidentResponse遵守Identifiable协议即可,完全不影响原有编解码逻辑:
extension IncidentResponse: Identifiable { // 直接复用内部事故详情的ID,为了避免空值也可以加默认UUID var id: String { incident?.id ?? UUID().uuidString } }
添加后你的原有ForEach代码不需要做任何修改就可以正常运行。
方案2:新增UUID属性并排除在编解码之外
如果你需要独立的ID字段和事故ID做区分,就自定义CodingKeys只保留需要编解码的字段:
struct IncidentResponse: Codable, Identifiable { let incident: IncidentDetails? // 给id默认值,且不加入CodingKeys,不会参与编解码 let id = UUID().uuidString // 仅列出需要和JSON映射的字段 enum CodingKeys: String, CodingKey { case incident } }
方案3:临时方案,无需修改模型
直接在ForEach处指定ID的映射路径,不需要修改模型定义:
// 替换你原有ForEach的行即可 ForEach(existingIncidents, id: \.incident?.id ?? UUID().uuidString) { incident in
内容的提问来源于stack exchange,提问作者DevB1
相关产品推荐
相关产品推荐

