Arrays 筛选和映射数组时的SwiftUI EXC_BAD_指令

Arrays 筛选和映射数组时的SwiftUI EXC_BAD_指令,arrays,swift,filter,swiftui,exc-bad-instruction,Arrays,Swift,Filter,Swiftui,Exc Bad Instruction,我有一个名为“课程”的实体,它包括: @NSManaged public var timeMinutes: Double @NSManaged public var id: UUID @NSManaged public var lessonDescription: String @NSManaged public var date: Dates @NSManaged public var date: Date “日期”属性通过一对多关系链接到单独的“日期”实体,该实体包括: @NSManag

我有一个名为“课程”的实体,它包括:

@NSManaged public var timeMinutes: Double
@NSManaged public var id: UUID
@NSManaged public var lessonDescription: String
@NSManaged public var date: Dates
@NSManaged public var date: Date
“日期”属性通过一对多关系链接到单独的“日期”实体,该实体包括:

@NSManaged public var timeMinutes: Double
@NSManaged public var id: UUID
@NSManaged public var lessonDescription: String
@NSManaged public var date: Dates
@NSManaged public var date: Date
我现在正试图显示一个图表,其中包含按“日期”求和的“timeMinutes”。此最终光线将具有以下结构:

struct FinalArray {
    let summedMinutes : Double
    let date : Date
}
生成(和显示)此数组的代码如下所示:

import SwiftUI
import SwiftUICharts

struct Test: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Lessons.allLessonsFetchRequest()) var lessons: FetchedResults<Lessons>

   var finalArray = [FinalArray]()

    init(){
        let allKeys = Set<Date>(lessons{$0.date.date})
        for key in allKeys {
            let sum = lessons.filter({$0.date.date == key}).map({$0.timeMinutes}).reduce(0, +)
            finalArray.append(FinalArray(summedMinutes:sum, date:key))
        }
       finalArray = finalArray.sorted(by: {$0.date < $1.date})
    }

    var body: some View {
        VStack{
               LineView(data:  finalArray.map {$0.summedMinutes}, title: "This graph returns empty").padding()
               LineView(data:  lessons.map {$0.timeMinutes}, title: "This graph works").padding()
        }
    }
}
有人知道我怎么解决这个问题吗?这是什么原因

如果我在视图中对核心数据进行ForEach,它可以正常工作:

var dateFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.dateStyle = .long
return formatter
}

        ForEach(lessons.map {$0.date.date}, id: \.self) { item in
            VStack{
                Text("\(item, formatter: self.dateFormatter)")
            Text(String(self.lessons.filter{$0.date.date == item}.map {$0.timeMinutes}.reduce(0, +)))
            }
        }

这段代码可以工作,但它不是我想要的,我想在数组中显示总计的“timeMinutes”。任何想法或解决方法都将是非常受欢迎的

在查看初始更新时获取
课程
,但在
init
中尚未定义它,因此尝试在其中使用它会导致崩溃

以下是可能的方法:

   @State private var finalArray = [FinalArray]()

    var body: some View {
        VStack{
               LineView(data:  finalArray.map {$0.summedMinutes}, title: "This graph returns empty").padding()
               LineView(data:  lessons.map {$0.timeMinutes}, title: "This graph works").padding()
        }
        .onAppear {
           let allKeys = Set<Date>(lessons{$0.date.date})
           for key in allKeys {
               let sum = lessons.filter({$0.date.date == key}).map({$0.timeMinutes}).reduce(0, +)
               finalArray.append(FinalArray(summedMinutes:sum, date:key))
           }
          finalArray = finalArray.sorted(by: {$0.date < $1.date})
       }
    }
@State private var finalArray=[finalArray]()
var body:一些观点{
VStack{
LineView(数据:finalArray.map{$0.summedMinutes},标题:“此图返回空”).padding()
LineView(数据:lessons.map{$0.timeMinutes},标题:“此图有效”).padding()
}
奥纳佩尔先生{
让allKeys=Set(课程{$0.date.date})
用于输入所有键{
让sum=lessons.filter({$0.date.date==key}).map({$0.timeMinutes}).reduce(0,+)
追加(finalArray(summedMinutes:sum,date:key))
}
finalArray=finalArray.sorted(按:{$0.date<$1.date})
}
}

查看初始更新时会获取
课程
,但在
init
中尚未定义课程,因此尝试在其中使用课程会导致崩溃

以下是可能的方法:

   @State private var finalArray = [FinalArray]()

    var body: some View {
        VStack{
               LineView(data:  finalArray.map {$0.summedMinutes}, title: "This graph returns empty").padding()
               LineView(data:  lessons.map {$0.timeMinutes}, title: "This graph works").padding()
        }
        .onAppear {
           let allKeys = Set<Date>(lessons{$0.date.date})
           for key in allKeys {
               let sum = lessons.filter({$0.date.date == key}).map({$0.timeMinutes}).reduce(0, +)
               finalArray.append(FinalArray(summedMinutes:sum, date:key))
           }
          finalArray = finalArray.sorted(by: {$0.date < $1.date})
       }
    }
@State private var finalArray=[finalArray]()
var body:一些观点{
VStack{
LineView(数据:finalArray.map{$0.summedMinutes},标题:“此图返回空”).padding()
LineView(数据:lessons.map{$0.timeMinutes},标题:“此图有效”).padding()
}
奥纳佩尔先生{
让allKeys=Set(课程{$0.date.date})
用于输入所有键{
让sum=lessons.filter({$0.date.date==key}).map({$0.timeMinutes}).reduce(0,+)
追加(finalArray(summedMinutes:sum,date:key))
}
finalArray=finalArray.sorted(按:{$0.date<$1.date})
}
}