更新CoreData项时遭遇"No exact matches in reference to static method 'buildExpression'"错误
buildExpression错误 时隔许久重新做iPhone开发,在准备保存时更新CoreData中Item的count值(示例中设为0),执行item.count = 0时触发如下错误:
No exact matches in reference to static method 'buildExpression'
相关代码:
import SwiftUI import CoreData struct CollectedFormView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Item.name, ascending: true)], predicate: NSPredicate(format: "count > %i", Int32(0)), animation: .default ) private var items: FetchedResults<Item> var body: some View { VStack { Form { ... } } .toolbar { ToolbarItem { Button("Save") { saveItems() } } }.navigationTitle("Collected Items") } } private func saveItems() { ForEach(items) { item in if (collected[item.name ?? ""] != nil) { item.count = 0 } } ... } }
已移除无关代码,求指明错误可能原因。
数据类型不匹配:检查CoreData模型里
Item的count属性类型。如果模型中count是Int32类型,直接赋值0(Swift默认是Int类型)会导致隐式转换冲突,要写成item.count = Int32(0)。CoreData和Swift的数值类型对应必须严格,比如Integer 32对应Int32,Integer 64对应Int64,别混用。FetchRequest过滤条件冲突:你的
FetchRequest用了predicate: NSPredicate(format: "count > %i", Int32(0)),只加载count>0的条目,但修改时把count设为0,这会导致修改后的数据不符合原请求的过滤条件,SwiftUI在更新视图时可能出现表达式构建异常。可以先去掉Predicate测试,或者调整逻辑,比如修改后重新发起请求。属性命名冲突:
count是Swift系统的常用属性/方法(比如集合的count),如果CoreData模型里的属性叫count,可能和系统标识符重名,导致编译器混淆。建议把属性名改成itemCount这类不会冲突的名称。上下文操作问题:虽然注入了
viewContext,但要确保修改操作在同一个上下文里执行。另外,修改后记得调用try? viewContext.save()(你的代码里省略了这部分,虽然不是当前错误的直接原因,但也是必要步骤)。
内容的提问来源于stack exchange,提问作者Peter

