SwiftUI EXC_BAD_INSTRUCTION при фильтрации и отображении массива - PullRequest
1 голос
/ 19 апреля 2020

У меня есть объект под названием «Уроки», который состоит из:

@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 по дате. Этот 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 в массиве. Любые идеи или обходные пути будут приветствоваться!

1 Ответ

0 голосов
/ 20 апреля 2020

lessons извлекается при первоначальном обновлении представления, но на init оно еще не определено, поэтому при попытке использовать его у вас есть cra * sh.

Вот Возможный подход:

   @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})
       }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...