Сделать объект 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 частный)

Другие вопросы по тегам