SwiftUI调用API填充List报ObservedObject要求Video遵守ObservableObject错误
错误根源
你出现报错的核心原因是类名拼写混淆:你定义的符合ObservableObject协议的网络请求类是复数形式的Videos,但你在ContentView里初始化的是单数形式的Video——Video是你定义的纯数据结构体,本身没有遵守ObservableObject协议,完全不能用于@ObservedObject声明。
除此之外你还存在List遍历对象未定义的问题,整体修复方案如下:
修复步骤
1. 修正@ObservedObject初始化代码
把ContentView里报错的那行替换成正确的网络请求类实例:
// 错误写法 // @ObservedObject var videoObject = Video() // 修正后写法 @ObservedObject var videoObject = Videos()
2. 修正List遍历逻辑
你当前的List直接使用了不存在的description变量,需要绑定请求回来的视频数组,Video已经遵守Identifiable协议,可以直接遍历:
// 错误的List写法 /* List(description, id: \.self) { description in Text(description) } */ // 修正后的List写法,可直接渲染视频标题、描述等内容 List(videoObject.videoDataArray) { video in VStack(alignment: .leading, spacing: 4) { Text(video.heading ?? "无标题") .font(.headline) Text(video.description ?? "无简介") .font(.subheadline) .foregroundColor(.gray) } }
3. 可选优化(避免崩溃风险)
你当前网络请求里的强制解包(StartEventResponse.data_array?.video)!在接口返回空值时会直接闪退,建议改成可选绑定处理空值:
DispatchQueue.main.async { if let videos = StartEventResponse.data_array?.video { self.videoDataArray = videos } else { // 可自行添加空数据提示逻辑 print("未获取到有效视频数据") } }
内容的提问来源于stack exchange,提问作者Akash Neeli
相关产品推荐
相关产品推荐

