Каковы функциональные различия между CodeGen Coredata 'manual / none + create NSManagedObject subclass' и 'category / extension' - PullRequest
0 голосов
/ 22 декабря 2018

Я прочитал Подклассы NSManagedObject с swift 3 и Xcode 8 beta и прочитал этот отличный учебник.Еще есть вопросы по некоторым пунктам.

Сходства:

  1. Я могу настроить оба класса так, как мне нравится.
  2. Я могу добавить новые атрибуты или удалить или переименоватьатрибутов.то есть для category/extension он будет обновлен после новой сборки (в производных данных), а в случае manual/none он оставит файл класса без изменений и обновит расширение в файловой навигации, т.е. я не буду в конечном итоге сдубликат файла.Все это обрабатывается Xcode, потому что они помечены препроцессором @NSManaged
  3. . Выгрузка чего-то вроде @NSManaged public var name: String? прямо в существующий подкласс NSManagedObject недопустима.Я пытался сделать entity.name = "John", но я получил следующую ошибку: reason: '-[SomeEntity setName:]: unrecognized selector sent to instance 0x60400009b120'.Я считаю, что это разумно.Я думаю, что без использования Core Data Model Editor методы доступа метода установки / получения не создаются.

Различия:

Для Category/Extension вам просто нужно создать класс самостоятельно и добавить любые дополнительные функции / свойства, которые вам нужны.

Для Category/Extension атрибуты создаются в производных данных, что достаточно.Потому что вам никогда не нужно видеть этот файл.Его существования достаточно, чтобы все заработало.

И особенно в контексте внесения изменений в ваши свойства NSManaged:

Изменение типа свойства,Например, NSDate до Date разрешено только для Manual/None.Пример здесь

Изменение опциональности типа, например, String? на String, разрешено только для Manual/None.Пример здесь

Изменение уровня доступа к свойству, например, с public на private, разрешено только для Manual/None.Пример здесь

Имея это в виду, есть существенная разница , если Я выбираю Manual/None Codegen и но не выберите «создать подкласс NSManagedObject».В этом случае я сам начинаю писать весь код (подкласс от NSManagedObject и пишу NSManaged для каждого свойства) ... или, если я сам не пишу весь этот код, я все равно могу получить доступ к / установить поля, используя KVC, что неудобно!

В двух словах, я просто пытаюсь выяснить весь спектр возможностей, которые я могу получить от использования Manual/None.

Вопрос: Помимо 9 заметок , которые мне нужно знать, правильно ли я проверил, важен вопрос : какизменение NSDate на Date или необязательное на необязательное не нарушает сопоставления между моим классом NSManagedObject и моим графом объектов при изменении свойства NSDate на String действительно нарушает !!Имеет ли это какое-то отношение к вещам, которые гарантированно приводятся между Swift и Objective-C, т.е. к вещам, которые можно кастовать через as - без ? или !?

1 Ответ

0 голосов
/ 31 декабря 2018

Для обращения к каждой из ваших заметок и рассмотрения случаев, когда для codegen установлено значение Manual/None и Category/Extension:

  1. Да, в любом случае вы можете настроить классы так, как вам нравится (в пределахограничения - например, класс должен быть подклассом - прямо или косвенно - NSManagedObject).
  2. Правильно.Вы можете добавлять, изменять или удалять атрибуты в редакторе моделей.В случае Category/Extension соответствующие изменения будут внесены автоматически.В случае Manual/None вы можете либо вручную обновить Расширение (или файл класса), либо повторить «создание подкласса NSManagedObject», который обновит Расширение с измененными деталями атрибута.Если вы этого не сделаете, XCode не распознает подробности нового атрибута и не предоставит для них завершение кода (и не будет успешно компилироваться, если вы попытаетесь переопределить завершение кода).Но в отличие от того, что вы думаете, это не имеет ничего общего со свойствами, помеченными как @NSManaged.
  3. Правильно.Добавление свойства @NSManaged к определению класса (или расширению) достаточно, чтобы сообщить Xcode, что свойство существует (так что вы можете ссылаться на них в коде), но не создает соответствующий метод получения / установки.Таким образом, ваш код вылетит.
  4. Да, для Category/Extension просто создайте и настройте файл класса, как вам требуется.
  5. Да, для Category/Extension свойства объявлены в автоматически создаваемом расширениифайл в производных данных.
  6. Изменение определения свойства любым способом - от даты до NSDate, или пометка его частным, или что-либо еще - может быть сделано только в случае Manual/None, поскольку файл расширения в производных данныхперезаписывается с каждой новой сборкой, поэтому все изменения будут потеряны.
  7. То же
  8. То же
  9. Исправить.Вы могли бы написать свое приложение, даже не создавая отдельные подклассы NSManagedObject (автоматически или вручную), если вы используете KVC для доступа к свойствам.

Что касается вашей конечной точки: вы не можете произвольно изменить тип свойстваопределение: тип, указанный в редакторе модели, должен соответствовать типу, указанному в определении свойства.Вы можете переключаться между необязательными и необязательными версиями одного и того же типа, и вы можете переключаться между Date и NSDate и т. Д., Но переключение с Date на String не будет работать.Я подозреваю, что вы правы, что это связано с мостовым соединением между типом значения Swift и соответствующим ссылочным типом Objective-C с использованием as.Смотрите здесь .

...