如何将Core Data数据接入Swift Charts?遇类型转换问题求助
Core Data数据接入Swift Charts的问题解决
问题描述
已通过FetchRequest获取Core Data数据:
@Environment(\.managedObjectContext) var managedObjContext @FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)]) var day: FetchedResults<Item>
尝试接入Swift Charts时,编写的代码无法运行,报错信息:Cannot convert value of type '() -> BarMark' to expected argument type '(FetchedResults.Element) -> BarMark' (aka '(Item) -> BarMark')
错误代码如下:
import SwiftUI import Charts struct ChartView: View { @Environment(\.managedObjectContext) var managedObjContext @FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)]) var day: FetchedResults<Item> @State var low = 0 @State var top = 0 @State var ir = 0 @State var date = Date() var body: some View { Chart(day) { BarMark( x: .value("Day", low), y: .value("Sales", top) ) } } }
错误原因
- 闭包参数缺失:
Chart的数据源闭包需要接收FetchedResults.Element(即Item对象)作为参数,但代码中未声明该参数,导致闭包签名不匹配。 - 未使用Core Data数据:代码依赖
@State变量low、top,完全没有调用已获取的Core Data数据源day,违背了接入Core Data数据的初衷。 - 潜在的Plottable类型问题:若
Item实体的属性类型不满足Swift Charts的Plottable协议,也会导致绘制失败,但当前直接报错源于闭包签名错误,需优先解决。
解决方案
1. 修正闭包签名,绑定Core Data数据
在Chart的闭包中声明Item参数,直接从Item对象中读取需要绘制的属性(需确保属性名与Core Data模型中的定义一致)。
2. 适配Plottable类型
Swift Charts默认支持Int、Double、Date、String等基础类型作为Plottable类型,若Item的属性是这些类型可直接使用;若为自定义类型,需扩展该类型实现Plottable协议。
修正后的代码示例
import SwiftUI import Charts struct ChartView: View { @Environment(\.managedObjectContext) var managedObjContext @FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)]) var day: FetchedResults<Item> var body: some View { Chart(day) { item in // 假设Item实体包含date(Date类型)、low(Int/Double类型)、top(Int/Double类型)属性 BarMark( x: .value("日期", item.date ?? Date()), // 可选属性安全解包,避免崩溃 y: .value("峰值", item.top ?? 0) ) // 如需展示low数据系列,可添加第二个BarMark BarMark( x: .value("日期", item.date ?? Date()), y: .value("谷值", item.low ?? 0) ) } .chartXAxis { AxisMarks(position: .bottom) { value in AxisGridLine() AxisTick() AxisLabel(format: .dateTime.day().month(), centered: true) // 格式化日期显示 } } } }
关键改动说明
- 移除无用的
@State变量,直接调用Item对象的属性作为图表数据源 - 在
Chart闭包中添加item in,接收每个Item实例作为参数 - 对可选属性进行安全解包,避免空值崩溃
- 添加X轴日期格式化,优化图表可读性
内容的提问来源于stack exchange,提问作者Daniil Artemenko
相关产品推荐
相关产品推荐

