SwiftUI使用ForEach显示解码后JSON字典出现类型转换错误如何解决
问题原因
- 遍历对象错误:你代码中传入ForEach的
country.id是无效值,country是[String: String]类型的字典,不存在id属性,且你需要遍历的是字典内的所有键值对,而非其他对象。 - 重载匹配错误:当传入的参数不符合ForEach的可遍历序列要求时,SwiftUI错误匹配到了需要
Binding类型参数的ForEach重载,因此抛出Cannot convert value of type '[String : String]' to expected argument type 'Binding'的错误提示。 - 取值逻辑错误:你在ForEach闭包中把遍历得到的元素当作Country实例调用
.countries属性,实际遍历字典得到的是单个键值对,不存在该属性。
修复代码
仅需要修改ContentView中的ForEach逻辑即可,原有数据结构、请求类无需调整:
struct ContentView: View { @StateObject var api = APICALL() var body: some View { VStack(alignment: .leading) { // 遍历字典的键值对,以国家代码key作为唯一标识 ForEach(api.storedData.countries.sorted(by: <), id: \.key) { key, value in HStack(alignment: .top) { // key为国家二字码,value为国家名称,按需展示即可 Text("\(value) (\(key))") } } } .onAppear { api.loadData() } } }
补充说明
如果不需要保持字典结构,也可以在解码后将[String: String]的国家字典转为自定义模型数组使用,遍历逻辑会更直观,此处按你现有代码结构做最小改动即可满足需求。
内容的提问来源于stack exchange,提问作者Kamanda
相关产品推荐
相关产品推荐

