Swift / iOS: как получить доступ к свойствам объекта при приведении типа из протокола? - PullRequest
0 голосов
/ 03 ноября 2018

Сначала какой-то контекст: Я строю общий API для моей базы данных CoreData. Все объекты в моей модели живут в парах:

  • Класс NSManagedObject, который хранится в CoreData и может быть преобразован в объект NSObject с протоколом ManagedObjectProtocol
  • Класс NSObject, который фактически используется в моем приложении и может быть преобразован в NSManagedObject с протоколом, называемым DataObject

Мой протокол управляемого объекта

//MANAGED OBJECT PROTOCOL - Should be adhered to by all NSManagedObject classes
protocol ManagedObjectProtocol where Self: NSManagedObject {
    //var managedObjectID: NSManagedObjectID { get set }

    func populateRegularObject() -> DataObject
    func populateRegularObjectFromRelated<T: TypeErasedDataObject>(relatedObject: T, at key: String) -> DataObject
}

В моем API я загружаю объекты следующим образом:

let managedObject = API.shared.persistentContainer.newBackgroundContext().object(with: someObjectID) as! ManagedObjectProtocol
let toReturn = managedObject.populateRegulardObject() //<-- This Crashes

Проблема: Это успешно загружает мой объект. Теперь я должен заполнить DataObject, который принадлежит этому ManagedObjectProtocol, и использовать его в моем приложении. Но я не могу, потому что, по-видимому, приведение типов к протоколу загружает объект иначе, чем когда я печатаю его как обычный NSManagedObject. Сразу же, когда я получаю доступ к свойству загруженного ManagedObject, мое приложение вылетает с ошибкой EXC_BAD_ACCESS.

Вопрос : Как я могу получить доступ к свойствам моего NSManagedObject, когда мне нужно , чтобы привести его к протоколу?

Для меня было бы целесообразно сделать что-то вроде этого:

extension NSManagedObject where Self: ManagedObjectProtocol {
    func populateDataObject() -> DataObject
}

Но это не может быть сделано быстро. Кто-нибудь может предложить решение? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 ноября 2018

Следующий пост поможет вам лучше понять проблему

https://www.lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/

По сути, кажется, что данные ядра не способны обрабатывать протоколы, которые не управляются. Похоже, что базовые данные переписывают определение класса для передачи @NSManaged через прокси-методы, но не могут сделать это для протоколов.

Добавление ключевого слова dynamic в объявление собственности решит эту проблему.

...