SwiftUI и компилятор не может проверить это выражение в разумные сроки - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь реализовать представление списка, используя SwiftUI и основные данные, но сталкиваюсь с ошибкой «компилятор не может проверить это выражение в разумные сроки». Список содержит «уроки», и каждый «тип» урока приводит к игре другого типа, однако возникает ошибка, когда я добавляю условия if, else if, которые ведут к соответствующей ссылке на игру. Из других постов я понимаю, что код должен быть разбит на более простые части, но мне интересно, как лучше всего это сделать, особенно для условных операторов. Один из способов, который я попробовал, заключается в использовании спецификаций c @FetchRequests для извлечения одного указанного c урока за раз, и хотя это работает для заполнения списка, оно создает неожиданное поведение, когда сущность обновляется из другого представления. Подробнее об этой проблеме см. Здесь: SwiftUI List View не обновляется после обновления сущности Core Data в другом View . Буду признателен за любые предложения о том, как упростить этот код или как избежать этой ошибки. Кстати, эта ошибка возникает только при использовании основных данных; когда я «жестко кодирую» объекты напрямую, используя классы в файле swift, эта ошибка не возникает.

import SwiftUI
import CoreData
import UIKit

struct LessonList: View {

@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Lesson.entity(), sortDescriptors: []) var lessons: FetchedResults<Lesson>

var body: some View {

    NavigationView {

        List {
            Section(header: Text("Test")) {
                ForEach(lessons) { lesson in
                    if (lesson.stage == 1) && (lesson.type == "phonicIntro") {
                        NavigationLink(destination: PhonicIntroGame(lesson: lesson)) {
                            LessonRow(lesson: lesson)
                        }
                    } else if (lesson.stage == 1) && (lesson.type == "phonicDrag") {
                        NavigationLink(destination: PhonicDragGame(lesson: lesson)) {
                            LessonRow(lesson: lesson)
                        }
                    }
                }
            }
        }
        .navigationBarTitle("Lessons")            
    }
}//end of body

1 Ответ

2 голосов
/ 19 марта 2020

Такая ошибка является хорошим индикатором, чтобы разбить ваш взгляд на более простые части, например (только идея, потому что я не могу скомпилировать это)

ForEach(lessons) { lesson in
    self.lessonRow(for: lesson)
}

...

private func lessonRow(for lesson: Lesson) -> some View {
  Group {
    if (lesson.stage == 1) && (lesson.type == "phonicIntro") {
        NavigationLink(destination: PhonicIntroGame(lesson: lesson)) {
            LessonRow(lesson: lesson)
        }
    } else if (lesson.stage == 1) && (lesson.type == "phonicDrag") {
        NavigationLink(destination: PhonicDragGame(lesson: lesson)) {
            LessonRow(lesson: lesson)
        }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...