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

如何遍历API调用返回的数据并在SwiftUI视图中正常渲染展示

错误原因

你的语法报错由两个核心问题导致,和getDevices的调用逻辑无关,onAppear里触发网络请求的写法是正确的:

  • SwiftUI的ForEach初始化没有content参数标签,你写的ForEach(content: ...)属于多余的错误语法,直接删掉content:标签即可。
  • 你给ForEach传入的遍历源是callDevices.getDevices(),这个方法是用来触发网络请求的,没有返回值(返回Void),不能作为数组被遍历。你应该直接使用CallDevices类中@Published修饰的devices数组作为遍历源,网络请求成功后这个数组会自动更新,触发ForEach自动刷新视图。

补充注意:如果你使用\.self作为ForEach的唯一标识,需要确保你的Device结构体已经遵守Hashable协议;如果Device本身有唯一的id属性,更推荐使用id: \.id作为唯一标识,避免数据重复时的视图异常。

修正后的核心代码

仅需要修改HomeTab里devices计算属性的ForEach部分即可,其余代码不需要改动:

private var devices: some View {
    VStack(alignment: .leading, spacing: nil) {
        // 修正后的ForEach写法
        ForEach(callDevices.devices, id: \.self) { device in
            HStack{
                Text(device.Name)
                Text(device.Status)
            }
        }
        Spacer()
    }
}
可选优化建议

你当前CallDevices里的解码逻辑用了强制解包try!,如果后端返回数据结构异常会直接导致App崩溃,可以替换为do-catch捕获错误提升稳定性:

do {
    let theData = try JSONDecoder().decode(Welcome.self, from: data!)
    DispatchQueue.main.async {
        self.devices = theData.devices
    }
} catch {
    print("解码失败: \(error.localizedDescription)")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:24:08