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

SwiftUI中@ObservedObject报错,API数据合并后视图不更新求助

问题:使用ObservableObject更新视图失败,报错‘Generic struct ‘ObservedObject’ requires that …. conform to ‘ObservableObject’’

我尝试用ObservableObject在API调用完成后更新视图,但一直遇到上述错误。原本单API调用功能正常,现在需要将两组API数据合并到同一个变量中,但第二次调用后数据修改无法在界面体现。

现有代码结构

基础数据模型

struct consWrapper: Codable {
    let results: [ConsumptionData]
}

struct ConsumptionData: Codable, Identifiable {
    let id = UUID()
    let consumption: Float
    let interval_start: String
}

合并数据类与API调用函数

class combinedIntervalData: ObservableObject, Identifiable {
    var id: String
    @Published var consumptionVal: Float
    @Published var exportVal: Float
    
    init(id: String, consumptionVal: Float, exportVal: Float) {
        self.id = id
        self.consumptionVal = consumptionVal
        self.exportVal = exportVal
    }
}

var combinedData = [combinedIntervalData]()

func getReadings (completed: @escaping ([combinedIntervalData]) -> ()) {
    // ... 省略API请求逻辑
    
    let consumptionResults = try JSONDecoder().decode(consWrapper.self, from: data)
    consumptionResults.results.forEach { joinedInterval in 
        let intervalDate = combinedIntervalData(id: joinedInterval.interval_start, consumptionVal: joinedInterval.consumption, exportVal: 0)
        combinedData.append(intervalDate)    
    }
    DispatchQueue.main.async { completed(combinedData)}
}

第二组API数据合并逻辑

let exportResults = try JSONDecoder().decode(consWrapper.self, from: data)
exportResults.results.forEach { joinedInterval in 
    let savedData = combinedData.filter({$0.id == joinedInterval.interval_start})[0]
    savedData.exportVal = joinedInterval.consumption
}  

视图中的调用方式

@ObservedObject var combinedData:[combinedIntervalData] = []

问题详情

  • 第一次API调用正常,数据能显示在视图上
  • 第二次API调用时,控制台能看到正确数据,但修改后的exportVal无法在界面更新
  • 尝试改用@State时,代码无语法错误,但应用会在第二组API解码前崩溃
  • 使用@ObservedObject时直接报类型不匹配错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:15:00