SwiftUI не компилируется при попытке отфильтровать данные с использованием сравнения строк - PullRequest
1 голос
/ 11 октября 2019

в надежде, что кто-нибудь может мне помочь. Попытка выяснить, что здесь происходит без удачи. Приложение, которое я создаю, содержит представленный ниже SwiftUI View.

Этот вид встроен в другой вид, который содержит другие списки, VStack и т. Д. Он вызывается, когда элемент выбран для отображения другого списка данных на основе выбора пользователя.

Все это выглядит, действует и работает как задумано (без фильтрации данных).

На данный момент я использую образец набора данных, созданный с использованием простого словаря данных. Когда я пытаюсь применить фильтр к этим данным путем сравнения строк, это приводит к ошибке компиляции со следующими сообщениями:

Из Xcode:

Компилятор не может проверить типэто выражение в разумные сроки;попробуйте разбить выражение на отдельные подвыражения

Из Canvas:

timedOutSpecific (30.0, операция: «сборщик»)

В дополнение к этим ошибкам, энергопотребление Xcode резко возрастает до отказа.

Код, указанный ниже, будет работать, если я уберу код self.dataSet == aRecord.module в операторе if и заменим его на true. Каждый раз, когда я пытаюсь отфильтровать свой набор данных, это приводит к этим ошибкам.

import SwiftUI

struct DataListView: View {

    @State var titleBar = ""
    @State private var showFavorites = false
    @State private var showPriority = false
    @State var dataSet = ""

    var body: some View {

        List{

            ForEach (sampleData) { aRecord in

                if (((aRecord.isFavorite && self.showFavorites) ||
                    (aRecord.isPriority && self.showPriority) ||
                    (!self.showPriority)) && self.dataSet == aRecord.module ){

                    VStack {
                        NavigationLink(destination: DetailView(titleBar: aRecord.title, statuteData: aRecord.statuteData, isFavorite: aRecord.isFavorite)) {

                            HStack {
                                Text(aRecord.module)
                                    .font(.subheadline)

                                VStack(alignment: .leading) {
                                    Text(aRecord.title)
                                }
                                .scaledToFit()

                                Spacer()

                                if aRecord.isFavorite {
                                    Image(systemName: "star.fill")
                                        .imageScale(.small)
                                        .foregroundColor(.yellow)
                                }
                            }
                        }
                    }
                    .navigationBarTitle(self.titleBar)
                    .navigationBarItems(trailing:

                        HStack{

                            Button(action: {
                                self.showFavorites.toggle()
                            }) {
                                if self.showFavorites {
                                    Image(systemName: "star.fill")
                                        .imageScale(.large)
                                        .foregroundColor(.yellow).padding()
                                } else {
                                    Image(systemName: "star")
                                        .imageScale(.large).padding()
                                }
                            }

                            Button(action: {
                                self.showPriority.toggle()
                            }) {
                                if self.showPriority {
                                    Text("Priority")
                                } else {
                                    Text("Standard")
                                }
                            }
                    })
                }//endif
            }
        }//end foreach
    }
}

struct TempCode_Previews: PreviewProvider {
    static var previews: some View {
        DataListView(dataSet: "myDataSetID")
    }
}

Причина, по которой я считаю, что сравнение строк является виновником, к примеру, приводит к сбою, как описано выше. Я также попытался поместить условное в другие места по всему коду с теми же результатами. Каждый раз, когда я применяю этот тип фильтра, это вызывает сбой.

Любой совет приветствуется.

Спасибо.

1 Ответ

2 голосов
/ 11 октября 2019

Разбейте эту сложную логическую логику на функцию вне компоновщика представлений, которая принимает запись и возвращает логическую переменную, и она должна работать.

Я думаю, что компилятор борется, когда внутри тела есть сложная логика, и не может проверить типы возвращаемых данных и т. Д. И т. Д.

Функция проверки записи:

func verify(_ record: Record) -> Bool {
    return (((record.isFavorite && showFavorites) ||
    (record.isPriority && showPriority) ||
    (!showPriority)) && dataSet == record.module )
}

Использование в теле:

if self.verify(aRecord) {
...