我有一个Core Data实体,该实体具有名为id
的属性:
@NSManaged public var id: Int
在使用SwiftUI时,我添加了对Identifiable
的支持,因此Core Data实体现在符合它:
extension Car : Identifiable { }
当我试图编译时,我得到这个错误,例如当我试图在 predicate 中使用id时:
NSPredicate(format: "\(#keyPath(Car.id)) == \(id)")
错误:Ambiguous reference to member 'id'
如何使Car
实体符合Identifiable,同时保留其现有属性id
?
2条答案
按热度按时间dy1byipe1#
我认为错误是由 predicate 中使用keypath的方式引起的。请改用此形式,尽管它对于硬编码路径/属性不是最佳形式
更新:
我做了一些进一步的测试,注意到如果完全删除
id
属性,则会出现关于@objc的错误“#keyPath”的参数引用了非“@ objc”属性“id”
而不是说这个属性不存在,尽管我在删除与
Identifiable
的一致性时确实遇到了这样的错误,这让我怀疑编译器是否从已经存在的属性中合成了一个不使用@NSManaged/@objc的属性id
。我在一个项目的几个实体中使用了
id
,该项目也符合Identifiable
,但我没有在任何 predicate 中使用id
,所以这对我来说没有问题。我建议的解决方案是重命名模型中的属性,并将
id
声明为计算属性然后在 predicate 中使用
carId
,否则使用id
(一个选项是将carId
设为私有)5lhxktic2#
我已经成功地使用了符合可识别 predicate 的NSManagedObjects。
尝试:
NSPredicate(format: "id == %@", id as CVarArg)