如何遍历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
相关产品推荐
相关产品推荐

