Сделать объект Core Data (с существующим атрибутом id) совместимым с Identifiable?
У меня есть сущность Core Data с атрибутом с именем:
@NSManaged public var id: Int
Работая со SwiftUI, я добавляю поддержку
Identifiable
, так что теперь объект Core Data соответствует ему:
extension Car : Identifiable { }
Когда я пытаюсь скомпилировать, я получаю эту ошибку, например, когда пытаюсь использовать идентификатор в предикате:
NSPredicate(format: "\(#keyPath(Car.id)) == \(id)")
Ошибка:
Ambiguous reference to member 'id'
Как я могу сделать
Car
объект соответствует Идентифицируемому, сохраняя при этом свой уже существующий атрибут
id
?
2 ответа
Я использовал NSManagedObjects, которые успешно соответствуют Идентифицируемым с предикатами.
Пытаться:NSPredicate(format: "id == %@", id as CVarArg)
Я считаю, что ошибка вызвана тем, как вы используете ключевой путь в своем предикате. Вместо этого используйте эту форму, хотя она не оптимальна с жестко заданным путем / свойством
NSPredicate(format: "id = \(id)")
Обновлять:
Я провел дополнительное тестирование и заметил, что если полностью удалить свойство, я получу сообщение об ошибке @objc.
Аргумент '#keyPath' относится к не -'@objc' свойству 'id'
и не то, чтобы свойство не существовало, хотя я получил такую ошибку, когда удалил соответствие с. Это заставляет меня задуматься, синтезирует ли компилятор свойство из уже существующего, которое не использует @NSManaged / @objc.
Я использую в нескольких своих объектах в одном проекте, который также соответствует
Identifiable
но я не использую никаких предикатов, поэтому для меня это не проблема.
Мое рекомендуемое решение - переименовать свойство в модели и объявить его вычисляемым свойством.
@NSManaged public var carId: Int
extension Car : Identifiable {
public var id: Int {
carId
}
}
а затем использовать в предикатах и в противном случае
id
(один из вариантов - сделать
carId
частный)