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

如何读取并展示JSON中的字典?解决SwiftUI类型兼容报错

解决SwiftUI中字典无法在Text中插值的报错问题

报错原因

你遇到的Instance method 'appendInterpolation(_:formatter:)' requires that '[String : Int]' inherit from 'NSObject'报错,本质是SwiftUI的Text视图默认的字符串插值不支持直接传入Swift原生字典类型——该插值方法要求传入的类型必须继承自NSObject,而[String:Int]不符合这个要求。你的数据结构是正确的,和JSON响应匹配,问题出在字典的展示方式上。

可行解决方案

方案1:将字典转换为可读字符串

自定义一个方法,把字典的键值对拼接成字符串,再传入Text:

func formatDict(_ dict: [String: Int]) -> String {
    // 把每个键值对转成"键: 值"的格式,用换行分隔
    return dict.map { "\($0.key): \($0.value)" }.joined(separator: "\n")
}

在ContentView中使用:

Text(formatDict(data.data.stats))

方案2:遍历字典生成多个Text视图(推荐)

如果想要更整洁的展示效果,可以遍历字典的键值对,生成独立的Text视图:

// 替换原来的Text("\(data.data.stats)")
VStack(alignment: .leading, spacing: 4) {
    ForEach(Array(data.data.stats), id: \.key) { key, value in
        Text("\(key): \(value)")
    }
}

这种方式可以让每个键值对单独一行展示,可读性更强。

额外注意:异步更新UI必须切主线程

你的getData方法中,在后台线程直接赋值@State变量可能会导致UI更新异常,需要把赋值操作切换到主线程:

func getData() {
    let urlString = "https://russianwarship.rip/api/v1/statistics/latest"
    guard let url = URL(string: urlString) else { return } // 替换强制解包,更安全
    
    URLSession.shared.dataTask(with: url) { data, _, error in
        if let data = data {
            do {
                let decoder = JSONDecoder()
                let decodedData = try decoder.decode(Data.self, from: data)
                // 切主线程更新@State变量
                DispatchQueue.main.async {
                    self.data = decodedData
                }
            } catch {
                print("Hey there's an error: \(error.localizedDescription)")
            }
        }
    }.resume()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:57:22