2016-10-31 10 views
43

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

Создайте объект с именем «MapRegionObject» в файле .xcdatamodeld. enter image description here

Использование генератора автоматического кода, нажмите Редактор на панели навигации -> создать NSManagedOject Подкласс ...

Got два файла: MapRegionObject + CoreDataClass.swift и MapRegionObject + CoreDataProperties

Ошибки в двух файлах, показывающие на скриншоте: MapRegionObject + CoreDataClass.swift enter image description here

MapRegionObject + CoreDataProperties enter image description here

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

+1

Если вы используете автоматический код: определение класса, на объекте объекта, вы не должны создавать свой собственный подкласс NSManagedOject. XCode уже создал его для вас в DerivedData. Если вы хотите создать свой собственный подкласс, укажите другой код на вашей сущности. Проверьте эту доску: http://stackoverflow.com/questions/37905456/subclassing-nsmanagedobject-with-swift-3-and-xcode-8-beta –

ответ

109

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

Entity

Затем перейдите на вкладку Data Model Inspector :

Data Model Inspector

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

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

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

+5

Если вы уже создали свой класс с «Определение класса», выбранным под 'Codegen' и получил эту ошибку, сначала удалите файл .xcdatamodeld и создайте его снова. Затем установите «Manual/None» в «Codegen» и используйте генератор автоматического кода. –

+10

Альтернативно, если вы уже использовали «Определение класса», вы можете войти в существующий файл .xcdatamodeld и установить все текущие объекты в «Руководство/Нет» в Codegen. Обязательно сохраните проект (Файл -> Сохранить), удалите существующие Derived Data, очистите проект и затем выполните сборку. Решил это для меня, не переделав всю мою модель. – DJB

+0

СПАСИБО ТАК МНОГО! – coolcool1994

16

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

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

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

+0

Спасибо, ответ с большинством голосов исправил мою проблему, но это объясняло, почему это происходит в первую очередь. Теперь мне не нужно беспокоиться об этом исправлении или необходимости постоянно восстанавливать мои объекты, когда я их изменяю. – robhasacamera

2

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

  1. Reveal в Finder файл .xcdatamodeld базы данных.
  2. на .xcdatamodeld файл правой кнопкой мыши -> Показать содержимое пакета, если (.xcdatamodel) снова находит в пакете правой кнопкой мыши и «Показывать содержимое пакета». вы должны получить файл «contents».
  3. Открыть «содержимое» в текстовом редакторе.
  4. Command-F (codeGenerationType = "class") и заменить всю строку соответствия пустой строкой.

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

+1

Это не работает. Любое обоснование вашего подхода. –

+0

Согласитесь, обоснование было бы полезно. Это работало для коллеги, поэтому хотелось бы точно понять, что он делает. – dbreaux

2

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

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

1

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

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

изменить ваш класс:

class MyManagedObject : NSManagedObject { /* implementation*/ } 

к расширению:

extension MyManagedObject { /* implementation */ } 
2

В Xcode 8.2.1 Меню Продукт-Clean, И каждый это нормально, это так Verid ,

7

1) очистить проект (Cmd + Shift + K)

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

screenshot

3) Сгенерировать код еще раз (Редактор -> создать подклассы NSManagedObject)

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