Как сделать так, чтобы модели CoreData соответствовали протоколу? - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь сделать основную независимую от фреймворка кодовую базу. я хочу программирование, ориентированное на протокол, но у меня возникают проблемы при работе с 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 всегда создает необязательные свойства объекта в коде, даже если вы этого не хотите? Является ли решение буквально перезаписать сгенерированные вручную файлы?

1 Ответ

0 голосов
/ 03 июля 2019

В конце концов, я считаю, что протоколно-ориентированное программирование не совсем то, что обещано.Я надеялся, что почти вся кодовая база может быть сделана таким образом.В конце концов, решение состояло в том, чтобы подклассы NSManagedObject соответствовали протоколу путем явной записи методов доступа к свойствам протокола, которые обертывают некоторый атрибут в базовой модели данных.т.е. return myManagedObject.contentObject as! BookItemContent

...