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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:18:01