我正在做FetchRequest
@Environment(\.managedObjectContext) var managedObjContext
@FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)])
var day: FetchedResults<Item>
然后我把它放在Charts中,但是Swift Charts需要Plottable,在我看来,没有办法转换它。
请帮忙!
尝试做这种事,但行不通。错误:无法将类型“() -> BarMark”的值转换为预期参数类型“(FetchedResults.Element) -> BarMark”(又名“(Item) -> BarMark”)。我想,我应该将我的核心数据转换为 Plottable,但我不知道该怎么做。
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)
)
}
}
}
我找到了非常简单的解决方案,代码:
struct ChartView: View {
@Environment(\.managedObjectContext) var managedObjContext
@FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)]) var items: FetchedResults<Item>
@State var low = 0
@State var top = 0
@State var ir = 0
func getDate(date: Date)->String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd"
let stringDate = dateFormatter.string(from: date)
return stringDate
}
var body: some View {
Chart {
ForEach(items.prefix(5)) { item in
var dateInitial = getDate(date:(item.date!))
LineMark(x: .value("date", "\(item.date)"), y: .value("hours slept", item.top))
.cornerRadius(8.0)
.annotation(position: .overlay, alignment: .top, spacing: 2.0) {
Text("\(item.top, specifier: "%.2f")")
.font(.system(size:10))
.foregroundColor(.white)
.fontWeight(.bold)
}
}
}
}
}
struct ChartView_Previews: PreviewProvider {
static var previews: some View {
ChartView()
}
}