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
相关产品推荐
相关产品推荐

