Swift中使用ForEach遍历JSON数据的问题求助
Swift ForEach 读取JSON显示团队名问题解决
问题核心错误点
data声明为[TeamSchema?]多余,TeamSchema.allTeams本身是确定的非可选数组- ForEach 的
id路径错误,\.?.data无法提供唯一标识 - 团队名称访问路径错误,
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
相关产品推荐
相关产品推荐

