0

我有一个核心数据实体,它的属性名为id

@NSManaged public var id: Int

当我使用 SwiftUI 时,我正在添加对 的支持Identifiable,因此 Core Data 实体现在符合它:

extension Car : Identifiable { }

当我尝试编译时,例如当我尝试在谓词中使用 id 时收到此错误:

NSPredicate(format: "\(#keyPath(Car.id)) == \(id)")

错误:

Ambiguous reference to member 'id'

如何使Car实体符合 Identifiable 同时保持其现有属性id

4

1 回答 1

1

我相信该错误是由您在谓词中使用键路径的方式引起的。改用这种形式,尽管它不是硬编码路径/属性的最佳选择

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

更新:

我做了一些进一步的测试,并注意到如果我id完全删除了该属性,那么我会收到一个关于 @objc 的错误

'#keyPath' 的参数是指非'@objc' 属性'id'

并不是说该属性不存在,尽管当我删除对Identifiable. 这让我想知道编译器是否id从现有的不使用@NSManaged/@objc 的属性中合成了一个属性。

id在一个项目中的几个实体中使用了也符合Identifiable但我没有id在任何谓词中使用,所以这对我来说没有问题。

我推荐的解决方案是重命名模型中的属性并声明id为计算属性

@NSManaged public var carId: Int

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

然后carId在谓词和其他情况下使用id(一种选择是carId私有)

于 2021-08-12T19:12:04.533 回答