1

希望有人可以帮助我。一直试图弄清楚这里发生了什么,但没有运气。我正在构建的应用程序包含下面列出的 SwiftUI 视图。

This View is embedded in another View which contains other List's, VStack's, etc. It is called when an item is selected to show another list of data based upon the user's selection.

一切看起来、行为和工作都按预期进行(没有数据过滤)。

现在,我正在使用一个使用简单的数据字典创建的示例数据集。当我尝试通过字符串比较对此数据应用过滤器时,它会导致编译失败,并显示以下消息:

来自 Xcode:

编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式

从画布:

timedOutSpecific(30.0, operation: "一个 thunk to build")

除了这些错误之外,Xcode 的能源消耗也在飙升,直到出现故障。

如果我删除 if 语句中的代码self.dataSet == aRecord.module并将其替换为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")
    }
}

我认为字符串比较是罪魁祸首的原因之一是它如上所述崩溃。我还尝试将条件放置在代码中的其他位置,结果相同。任何时候我应用这种类型的过滤器都会导致发生这种崩溃。

任何建议表示赞赏。

谢谢你。

4

1 回答 1

2

将复杂的布尔逻辑分解为视图构建器之外的函数,该函数获取记录并返回布尔值,它应该可以工作。

我认为当主体内部存在复杂逻辑并且无法验证返回类型等时,编译器会遇到困难。

记录验证功能:

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

体内用法:

if self.verify(aRecord) {
于 2019-10-11T17:38:16.640 回答