Подтвердить что ты не робот

Недействительная декларация в автоматическом генерации кода NSManagedObject Подкласс Swift 3

Использование версии 8.1 Xcode.

Создайте объект с именем "MapRegionObject" в файле .xcdatamodeld. введите описание изображения здесь

Используя автоматический генератор кода, нажмите "Редактор" на панели навигации → создайте подкласс NSManagedOject...

Получил два файла: MapRegionObject + CoreDataClass.swift и MapRegionObject + CoreDataProperties

Ошибки в двух файлах, отображаемые на скриншоте: MapRegionObject + CoreDataClass.swift введите описание изображения здесь

MapRegionObject + CoreDataProperties введите описание изображения здесь

Пожалуйста, помогите мне исправить эти ошибки, спасибо вам большое!

4b9b3361

Ответ 1

В Xcode 8.1, прежде чем использовать автоматический генератор кода, вы должны выбрать сущность в вашей модели данных:

Entity

Затем перейдите на вкладку инспектора модели данных:

Data Model Inspector

Под "Codegen" выберите "Manual/Node"

После этого вы можете создать подкласс NSManagedObject без ошибок.


В качестве альтернативы, если вы уже использовали "Определение класса", вы можете перейти к существующему файлу.xcdatamodeld и установить для всех текущих объектов значение "Вручную/Нет" в Codegen. Обязательно сохраните ваш проект (Файл → Сохранить), удалите существующие производные данные, очистите проект и затем выполните сборку. Решил это для меня без необходимости переделывать всю мою модель.

Ответ 2

Я понял, что все это очень запутанно. Вам действительно нужно понять, что нового в CoreData. В основном, по умолчанию автоматически создается класс и расширения для вас в месте под названием "DerivedData", которое похоронено в ~/Library/Developer/Xcode/DerivedData​​strong > , где живут эти классы и их расширения, вне вашего источника кода. Лично, неспособность открывать и смотреть на них странно для меня, но что-то использовать.

В принципе, если у вас есть объект под названием "AppSettings" в вашей модели CoreData, вы можете просто использовать его без необходимости генерировать код самостоятельно. Если вы хотите использовать код в своем проекте, установите свойство Codegen в сущности для Manual/None. Затем сделайте то, что вы делали раньше: Редактор- > Создать классы NSManagedObject и т.д. Файлы будут завершены в вашем проекте.

Хорошей новостью является то, что если вы хотите создавать пользовательские расширения, просто сделайте это в своем проекте. Xcode будет смешивать сгенерированные файлы из другого места вне каталога проекта с файлами в каталоге проекта.

Ответ 3

1) очистить проект (cmd + shift + K)

2) В "контролере модели данных" для каждого созданного атрибута набора объектов для класса так же, как на скриншоте ниже

screenshot

3) Снова сгенерируйте код (Редактор → создайте подклассы NSManagedObject)

После этого все должно работать нормально.

Ответ 4

Проблема заключается в том, что вам больше не нужно создавать подклассы NSManagedObjectModel. ref: https://forums.developer.apple.com/thread/48988

Xcode автоматически генерирует классы или расширения класса для объектов и свойств в модели данных основных данных. Автоматический код генерация включена и отключена на основе сущности по сущности, и включен для всех объектов в новых моделях с использованием файла Xcode 8 формат. Эта функция доступна для любой модели данных, которая была обновлен до формата Xcode 8. Вы указываете, генерирует ли Xcode Swift или Objective-C для модели данных с использованием файла моделей данных инспектор. Когда автоматическая генерация кода включена для объекта, Xcode создает расширение класса или класса для объекта как указанному в инспекторе объектов: используется указанное имя класса и источники помещаются в проекты Derived Data. Для обоих Swift и Objective-C, эти классы непосредственно используются из проектов. Для Objective-C создается дополнительный файл заголовка для всех сгенерированных объектов в вашей модели: имя файла соответствует соглашение об именах 'DataModelName + CoreDataModel.h'.

Ответ 5

Закройте проект и выполните следующие инструкции:

  • Показать в базе данных файл базы данных .xcdatamodeld.
  • в файле .xcdatamodeld щелкните правой кнопкой мыши → Показать содержимое пакета, если (.xcdatamodel) снова найдется в пакете, щелкните правой кнопкой мыши и "Покажите содержимое пакета". вы должны получить файл "contents".
  • Откройте "содержимое" в текстовом редакторе.
  • Command-F (codeGenerationType = "class" ) и заменить всю строку соответствия пустой строкой.

Сохраните и снова откройте проект Xcode. Все должно хорошо работать.

Ответ 6

В Xcode 8.2.1, Menu-Product-Clean, и все нормально, это так verid.

Ответ 8

Не сражайтесь с Xcode на этом, если вам действительно не нужно изменять ваши сгенерированные свойства, поэтому вы просто разочаровываетесь.

Подумайте об автогенерированном классе как о любом другом классе в вашем приложении. Если вам нужно добавить функциональность к классу управляемых объектов, просто измените определение класса на расширение и расширьте свой объект.

измените свой класс:

class MyManagedObject : NSManagedObject { /* implementation*/ }

для расширения:

extension MyManagedObject { /* implementation */ }

Ответ 9

Это не ответ. Это просто объяснение того, что происходит с выборами

Убедитесь, что вы видите этот момент для курса Core Data Stanford

Ниже приведена расшифровка, которую я написал сам (она не на 100% точна):

По умолчанию это class definition, если вы выберете это. Он сгенерирует этот подкласс и будет просто работать. Вы сможете получить доступ к своим твитам как класс под названием Tweet. Это звучит хорошо. Кстати, если вы сделаете это, он не будет отображаться в вашем файловом навигаторе.

Тот, который мы выбираем чаще всего, является category/extension То, что он будет делать, будет генерировать только расширение класса Tweet. Вы должны написать сам класс твита. Расширение позаботится о создании всех переменных. Даже когда я снова переключаюсь на категорию/расширение , это расширение не отображается в навигаторе. Это как бы скрыто от тебя.

И почему нам нравится этот? Потому что много раз мы хотим добавить наш собственный код. Как и в твите, представьте, что вы хотите добавить статический метод, который берет данные из Twitter и превращает их в твит в базе данных. Где бы мы поместили код? Что ж, отличное место для размещения этого кода было бы в классе Tweet... если бы это было так... и расширение будет обрабатывать весь бизнес с переменными для вас.

Если вы выбрали manual/none для codegen. то есть не делайте никакого кода кода, тогда вы будете делать value/setValue(forKey:)... удачи в том, что value/setValue(forKey:) код будет беспорядочным. [то есть нет .propertyName = value... вам нужно было сделать setValue(value, forKey: propertyName) ].


Короче говоря, я не уверен, почему, но по какой-то причине, если вы не выберете подкласс create NSManagedObject то он, похоже, все еще работает, но не показывает, что происходит внутри. Очень противоречивый!


Затем также посмотрите эту демонстрацию курса Core Data Stanford:

Теперь мы знаем, что хотим получить доступ ко всему этому, не используя value/set (value: forKey:)... мы хотим иметь подклассы Users/Tweets. И мы хотим иметь vars [точечная нотация] для всех этих отношений, поэтому нам нужен этот код для генерации. То, как мы это делаем, мы просто выбираем сущность... и переходим к CodeGen. Это говорит по умолчанию определение класса. Это означает, что это сделано. Он генерирует класс под названием Tweet. и это будет работать с вар и все отношения. Это на самом деле не то, что мы хотим. Мы хотим выбрать это [Категория/Расширение]. Где только создать расширение для Tweet и добавить материал var. Это потому, что мы хотим написать класс Tweet и поместить туда свой собственный код. Очень часто пишут наш собственный класс. Но вы все еще хотите вар магии.