Я пытаюсь сделать основную независимую от фреймворка кодовую базу. я хочу программирование, ориентированное на протокол, но у меня возникают проблемы при работе с CoreData.
Скажите, у меня есть протокол:
public protocol BookItem {
var title: String { get }
var filename: String { get }
var createdAt: Date { get }
var content: BookItemContent? { get }
}
и другой протокол
public protocol BookItemContent {
var bookItem: BookItem { get }
var data: Data { get }
}
Когда я делаю конкретные типы в CoreData, у меня может быть:
class CDBookItem: NSManagedObject, BookItem {
@NSManaged public var title: String?
@NSManaged public var filename: String?
@NSManaged public var createdAt: NSDate?
@NSManaged public var content: CDBookItemContent?
}
class CDBookItemContent: NSManagedObject, BookItemContent {
@NSManaged public var data: NSData?
@NSManaged public var bookItem: CDBookItem?
}
У меня есть 3 проблемы здесь:
1) Теперь у меня есть несколько свойств с разными типами возврата. (например, свойство .content
)
Как мне лучше всего решить эту проблему? Худший и грязный способ - переименовать все атрибуты Core-Data, а затем обернуть их для соответствия.
Другой способ, который я вижу, - это вручную создать подклассы NSManagedObject, а затем изменить разновидность, создаваемую кодеком CoreData, чтобы удалить эту возможность. Тем не менее, тогда у меня остались content: BookItemContent
и content: CDBookItemContent
, так что я не знаю, есть ли элегантный способ сделать то, что я надеюсь сделать здесь. Я надеялся, что смогу просто объявить, что подкласс NSManagedObject соответствует предполагаемому типу протокола, и компилятор это выяснит.
2) Core Data codegen использует типы 'NSObject' вместо их современного эквивалента. (т. е. NSData, а не Data, NSDate и не Date). Могу ли я просто изменить файлы codegen, чтобы удалить «NS» и получить бесплатный мост?
3) Известно ли, что CoreData всегда создает необязательные свойства объекта в коде, даже если вы этого не хотите? Является ли решение буквально перезаписать сгенерированные вручную файлы?