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

如何将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)
            )
                
            }
        }
        
    }

错误原因

  1. 闭包参数缺失:Chart的数据源闭包需要接收FetchedResults.Element(即Item对象)作为参数,但代码中未声明该参数,导致闭包签名不匹配。
  2. 未使用Core Data数据:代码依赖@State变量low、top,完全没有调用已获取的Core Data数据源day,违背了接入Core Data数据的初衷。
  3. 潜在的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:31:14