尝试使用字符串比较过滤数据时 SwiftUI 编译失败
SwiftUI fails to compile when attempting to filter data using string comparison
希望有人能帮助我。一直试图弄清楚这里发生了什么,但没有运气。我正在构建的应用程序包含下面列出的 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:
The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
来自Canvas:
timedOutSpecific(30.0, operation: "a 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")
}
}
我认为字符串比较是罪魁祸首的原因之一是,它如上所述崩溃了。我还尝试将条件语句放在整个代码的其他位置,结果相同。任何时候我应用这种类型的过滤器都会导致崩溃发生。
如有任何建议,我们将不胜感激。
谢谢。
将复杂的布尔逻辑分解为视图构建器外部的函数,该函数接受记录并且 returns 是一个布尔值,它应该可以工作。
我认为当主体内部存在复杂逻辑并且无法验证 return 类型等时,编译器会遇到困难。
记录验证功能:
func verify(_ record: Record) -> Bool {
return (((record.isFavorite && showFavorites) ||
(record.isPriority && showPriority) ||
(!showPriority)) && dataSet == record.module )
}
正文中的用法:
if self.verify(aRecord) {
希望有人能帮助我。一直试图弄清楚这里发生了什么,但没有运气。我正在构建的应用程序包含下面列出的 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:
The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
来自Canvas:
timedOutSpecific(30.0, operation: "a 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")
}
}
我认为字符串比较是罪魁祸首的原因之一是,它如上所述崩溃了。我还尝试将条件语句放在整个代码的其他位置,结果相同。任何时候我应用这种类型的过滤器都会导致崩溃发生。
如有任何建议,我们将不胜感激。
谢谢。
将复杂的布尔逻辑分解为视图构建器外部的函数,该函数接受记录并且 returns 是一个布尔值,它应该可以工作。
我认为当主体内部存在复杂逻辑并且无法验证 return 类型等时,编译器会遇到困难。
记录验证功能:
func verify(_ record: Record) -> Bool {
return (((record.isFavorite && showFavorites) ||
(record.isPriority && showPriority) ||
(!showPriority)) && dataSet == record.module )
}
正文中的用法:
if self.verify(aRecord) {