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

iOS17 SwiftUI:JSON嵌套数组适配List展示的Identifiable问题

解决SwiftUI List要求嵌套数据遵循Identifiable的问题

方法一:让嵌套数据模型直接遵循Identifiable协议

这是最规范的处理方式,直接给你的OtherData结构体添加Identifiable协议,并提供唯一标识符id:

情况1:JSON中已有唯一字段

如果你的JSON里key3对应的数组元素本身就有唯一标识(比如id字段),直接在模型中声明并遵循协议:

struct ThisData: Codable {
    let key1: String
    let key2: Int
    let key3: [OtherData]
    
    struct OtherData: Codable, Identifiable {
        let id: String // 对应JSON中的唯一id字段
        let name: String
        let value: String
        // 其他字段...
    }
}

情况2:JSON中无现成唯一字段

如果JSON里没有唯一字段,可自动生成UUID作为id,同时通过CodingKeys忽略这个自动生成的字段(避免Codable解析报错):

struct ThisData: Codable {
    let key1: String
    let key2: Int
    let key3: [OtherData]
    
    struct OtherData: Codable, Identifiable {
        let id = UUID() // 自动生成唯一标识符
        let name: String
        let value: String
        // 其他字段...
        
        // 定义CodingKeys,只解析JSON中存在的字段
        enum CodingKeys: String, CodingKey {
            case name, value
            // 不包含id,因为它是本地生成的
        }
    }
}

方法二:不修改模型,直接在List中指定id参数

如果不想改动现有数据模型,可在初始化List时,通过id参数指定元素的唯一标识路径:

// 假设yourData是解析后的ThisData实例
List(yourData.key3, id: \.name) { item in
    // 这里写你的行内容,比如
    VStack(alignment: .leading) {
        Text(item.name)
        Text(item.value)
            .font(.caption)
    }
}

这里的\.name要替换成OtherData中真正唯一的字段;如果没有单一唯一字段,可组合多个字段生成唯一标识:

List(yourData.key3, id: \.name + \.value) { item in
    Text("\(item.name): \(item.value)")
}

注意事项

  • 若使用组合字段作为id,必须确保组合后的字符串是唯一的,否则List会出现重复行或更新异常
  • 自动生成的UUID每次解析JSON都会变化,若需要持久化或跟踪元素状态,优先使用JSON自带的唯一字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:07:46