swift 是否使Core Data实体(具有现有的'id'属性)符合Identifiable?

vzgqcmou  于 2022-12-17  发布在  Swift
关注(0)|答案(2)|浏览(157)

我有一个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

dy1byipe

dy1byipe1#

我认为错误是由 predicate 中使用keypath的方式引起的。请改用此形式,尽管它对于硬编码路径/属性不是最佳形式

NSPredicate(format: "id = \(id)")

更新:
我做了一些进一步的测试,注意到如果完全删除id属性,则会出现关于@objc的错误
“#keyPath”的参数引用了非“@ objc”属性“id”
而不是说这个属性不存在,尽管我在删除与Identifiable的一致性时确实遇到了这样的错误,这让我怀疑编译器是否从已经存在的属性中合成了一个不使用@NSManaged/@objc的属性id
我在一个项目的几个实体中使用了id,该项目也符合Identifiable,但我没有在任何 predicate 中使用id,所以这对我来说没有问题。
我建议的解决方案是重命名模型中的属性,并将id声明为计算属性

@NSManaged public var carId: Int

extension Car : Identifiable {
    public var id: Int {
        carId
    }
}

然后在 predicate 中使用carId,否则使用id(一个选项是将carId设为私有)

5lhxktic

5lhxktic2#

我已经成功地使用了符合可识别 predicate 的NSManagedObjects。
尝试:NSPredicate(format: "id == %@", id as CVarArg)

相关问题