线程1:信号SIGABRT谓词SwiftUI

线程1:信号SIGABRT谓词SwiftUI,swift,swiftui,predicate,Swift,Swiftui,Predicate,由于某种原因,我得到了“SGNL SGBRT”错误,在这里我在谓词处赋值。原因是什么?我如何克服这个问题 struct SearchView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest var reminder: FetchedResults<CDReminder> @Binding var searchText: String init

由于某种原因,我得到了“SGNL SGBRT”错误,在这里我在谓词处赋值。原因是什么?我如何克服这个问题

struct SearchView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest var reminder: FetchedResults<CDReminder>
    @Binding var searchText: String

init(searchText: Binding<String>) {
    self._searchText = searchText
    var predicate : NSPredicate?
    predicate = NSPredicate(format: "name CONTAINS %@", searchText as! CVarArg) // SGNL SGBRT ERROR
    self._reminder = FetchRequest(
        entity: CDReminder.entity(),
        sortDescriptors: [],
        predicate: predicate
        )
}
    var body: some View {
        VStack{
            SearchBar(text: $searchText)
                .environment(\.managedObjectContext, viewContext)
            List{
                ForEach(reminder, id: \.self){ reminder in
                    DatedReminderCell(reminder: reminder, isSelected: false, onComplete: {})
                }
            }
        }
    }
}
struct SearchView:View{
@环境(\.managedObjectContext)私有变量viewContext
@FetchRequest变量提醒:FetchedResults
@绑定var searchText:String
init(searchText:Binding){
self.\u searchText=searchText
变量谓词:NSPredicate?
谓词=NSPredicate(格式:“名称包含%@”,搜索文本为!CVarArg)//SGNL SGBRT错误
self.\u提醒=FetchRequest(
实体:CDReminder.entity(),
sortDescriptors:[],
谓词:谓词
)
}
var body:一些观点{
VStack{
搜索栏(文本:$searchText)
.environment(\.managedObjectContext,viewContext)
名单{
ForEach(提醒,id:\.self){中的提醒
DatedReminderCell(提醒:提醒,isSelected:false,onComplete:{})
}
}
}
}
}

属性包装器
@Binding
具有以下语义:

  • self.\u searchText
    (与
    $searchText
    相同)表示结构
    绑定
    ,即双向绑定
  • self.searchText
    (与
    self相同。\u searchText.wrappedValue
    )表示包装的字符串值
它有点类似于可表示的字符串枚举。您需要的是
rawValue
,而不是枚举大小写

所以正确的语法是

predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)


由于
String
符合
CVArg
协议,因此不需要进行桥接转换。强制转换无论如何都是错误的。

属性包装器
@Binding
具有以下语义:

  • self.\u searchText
    (与
    $searchText
    相同)表示结构
    绑定
    ,即双向绑定
  • self.searchText
    (与
    self相同。\u searchText.wrappedValue
    )表示包装的字符串值
它有点类似于可表示的字符串枚举。您需要的是
rawValue
,而不是枚举大小写

所以正确的语法是

predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)


由于
String
符合
CVArg
协议,因此不需要进行桥接转换。强制转换无论如何都是错误的。

使用searchText.wrappedValue代替searchText。也不需要强制转换。使用searchText.wrappedValue代替searchText。也不需要施放。我根据你的答案编辑了我的代码。现在,在我的rementersapp.swift文件中,我得到了“Thread 1:”未实现的谓词SQL生成:(name包含\“\”)”错误如果我从代码中删除谓词行,那么我不会得到任何错误,所有的提醒都出现在一个工作表视图中,看起来您必须过滤空字符串大小写:
if!self.searchText.isEmpty{predicate=NSPredicate(format:…)}
它解决了问题,但没有检查我的searchText。无论我在SearchBarId中键入什么,它都会显示所有提醒。当初始化
searchView
时,请检查
searchText
是否包含非空字符串?我根据您的答案编辑了我的代码。现在,在我的rementersapp.swift文件中,我得到了“Thread 1:”未实现的谓词SQL生成:(name包含\“\”)”错误如果我从代码中删除谓词行,那么我不会得到任何错误,所有的提醒都出现在一个工作表视图中,看起来您必须过滤空字符串大小写:
if!self.searchText.isEmpty{predicate=NSPredicate(format:…)}
它解决了问题,但没有检查我的searchText。它显示了我在SearchBarID中键入的所有提醒。在初始化
searchView
时,是否检查
searchText
是否包含非空字符串?