线程 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 协议,因此不需要(桥接)转换。强制施法无论如何都是错误的。