【问题标题】:SwiftUI EXC_BAD_INSTRUCTION when filtering and mapping Array过滤和映射数组时的SwiftUI EXC_BAD_INSTRUCTION
【发布时间】:2020-04-19 20:16:03
【问题描述】:

我有一个名为 Lessons 的实体,它包括:

@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

我现在正在尝试显示一个图表,该图表包含“日期”和“时间分钟”的总和。这个 finalArray 将具有以下结构:

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()
        }
    }
}

我在 init 的第一行收到以下错误:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

有谁知道我该如何解决这个问题?这是什么原因?

如果我在我的视图中对核心数据执行 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'。非常欢迎任何想法或解决方法!

【问题讨论】:

    标签: arrays swift filter swiftui exc-bad-instruction


    【解决方案1】:

    lessons 是在视图初始更新时获取的,但在 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})
           }
        }
    

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2020-11-23
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2020-03-17
      • 2019-09-29
      • 2017-11-13
      相关资源
      最近更新 更多