Сначала какой-то контекст:
Я строю общий 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
}
Но это не может быть сделано быстро. Кто-нибудь может предложить решение? Любая помощь будет принята с благодарностью.