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

Swift中使用ForEach遍历JSON数据的问题求助

Swift ForEach 读取JSON显示团队名问题解决

问题核心错误点

  1. data 声明为 [TeamSchema?] 多余,TeamSchema.allTeams 本身是确定的非可选数组
  2. ForEach 的 id 路径错误,\.?.data 无法提供唯一标识
  3. 团队名称访问路径错误,team.Name 大小写不匹配,且未正确嵌套访问 data.team.name

解决方案

方法1:给模型添加Identifiable标识(推荐)

修改 TeamSchema.swift,让 TeamSchema 遵循 Identifiable 协议,直接复用内部团队的唯一ID:

import Foundation

// MARK: - TeamSchema
struct TeamSchema: Codable, Identifiable {
    let id: Int
    let data: DataClass
    
    // 自定义解码,从嵌套的team.id中获取标识
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        data = try container.decode(DataClass.self, forKey: .data)
        id = data.team.id
    }
    
    enum CodingKeys: String, CodingKey {
        case data
    }
    
    static let allTeams: [TeamSchema] = Bundle.main.decode(file: "TeamSchema.json")
    static let firstTeams: DataClass = allTeams[0].data
}

// 其余结构体保持不变...

方法2:直接在ForEach中指定唯一标识路径

如果不想修改模型,可直接在ForEach里指定正确的id路径,无需修改TeamSchema:

struct ContentView: View {
    private let data: [TeamSchema] = TeamSchema.allTeams
    
    var body: some View {
        NavigationView {
            List {
                ForEach(data, id: \.data.team.id) { team in
                    Text(team.data.team.name)
                }
            }
            .navigationTitle("团队列表")
        }
    }
}

#Preview {
    ContentView()
}

关键说明

  • 之前的 id: \.?.data 无效的原因:DataClass 未实现 Hashable 或 Identifiable,且可选链写法无法提供稳定的唯一标识
  • 团队名称的正确访问路径是 team.data.team.name,对应JSON嵌套层级:TeamSchema -> data -> team -> name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:05:55