线程 1:信号 SIGABRT 谓词 SwiftUI
Thread 1: signal SIGABRT Predicate SwiftUI
出于某种原因,我在为谓词赋值时收到“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: {})
}
}
}
}
}
属性 包装器 @Binding
具有以下语义:
self._searchText
(同$searchText
)表示结构体Binding<String>
,双向绑定。
self.searchText
(等同于self._searchText.wrappedValue
)表示包装后的字符串值。
它有点类似于 RawRepresentable String 枚举。您需要 rawValue
而不是枚举大小写。
所以正确的语法是
predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)
或
predicate = NSPredicate(format: "name CONTAINS %@", self._searchText.wrappedValue)
由于 String
符合 CVArg
协议,因此不需要(桥接)转换。强制施法无论如何都是错误的。
出于某种原因,我在为谓词赋值时收到“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: {})
}
}
}
}
}
属性 包装器 @Binding
具有以下语义:
self._searchText
(同$searchText
)表示结构体Binding<String>
,双向绑定。self.searchText
(等同于self._searchText.wrappedValue
)表示包装后的字符串值。
它有点类似于 RawRepresentable String 枚举。您需要 rawValue
而不是枚举大小写。
所以正确的语法是
predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)
或
predicate = NSPredicate(format: "name CONTAINS %@", self._searchText.wrappedValue)
由于 String
符合 CVArg
协议,因此不需要(桥接)转换。强制施法无论如何都是错误的。