Недействительная декларация в автоматическом генерации кода NSManagedObject Подкласс Swift 3
Использование версии 8.1 Xcode.
Создайте объект с именем "MapRegionObject" в файле .xcdatamodeld. ![введите описание изображения здесь]()
Используя автоматический генератор кода, нажмите "Редактор" на панели навигации → создайте подкласс NSManagedOject...
Получил два файла: MapRegionObject + CoreDataClass.swift и MapRegionObject + CoreDataProperties
Ошибки в двух файлах, отображаемые на скриншоте:
MapRegionObject + CoreDataClass.swift
![введите описание изображения здесь]()
MapRegionObject + CoreDataProperties
![введите описание изображения здесь]()
Пожалуйста, помогите мне исправить эти ошибки, спасибо вам большое!
Ответы
Ответ 1
В Xcode 8.1, прежде чем использовать автоматический генератор кода, вы должны выбрать сущность в вашей модели данных:
![Entity]()
Затем перейдите на вкладку инспектора модели данных:
![Data Model Inspector]()
Под "Codegen" выберите "Manual/Node"
После этого вы можете создать подкласс NSManagedObject
без ошибок.
В качестве альтернативы, если вы уже использовали "Определение класса", вы можете перейти к существующему файлу.xcdatamodeld и установить для всех текущих объектов значение "Вручную/Нет" в Codegen. Обязательно сохраните ваш проект (Файл → Сохранить), удалите существующие производные данные, очистите проект и затем выполните сборку. Решил это для меня без необходимости переделывать всю мою модель.
Ответ 2
Я понял, что все это очень запутанно. Вам действительно нужно понять, что нового в CoreData. В основном, по умолчанию автоматически создается класс и расширения для вас в месте под названием "DerivedData", которое похоронено в ~/Library/Developer/Xcode/DerivedDatastrong > , где живут эти классы и их расширения, вне вашего источника кода. Лично, неспособность открывать и смотреть на них странно для меня, но что-то использовать.
В принципе, если у вас есть объект под названием "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.
Ответ 7
Я нашел этот пост очень полезным для моего вопроса.
Что нового в Core Data Swift 3.0
Как использовать основные данные в iOS 10 (Swift 3)
Ответ 8
Не сражайтесь с Xcode на этом, если вам действительно не нужно изменять ваши сгенерированные свойства, поэтому вы просто разочаровываетесь.
Подумайте об автогенерированном классе как о любом другом классе в вашем приложении. Если вам нужно добавить функциональность к классу управляемых объектов, просто измените определение класса на расширение и расширьте свой объект.
измените свой класс:
class MyManagedObject : NSManagedObject { /* implementation*/ }
для расширения:
extension MyManagedObject { /* implementation */ }
Ответ 9
Это не ответ. Это просто объяснение того, что происходит с выборами
Ниже приведена расшифровка, которую я написал сам (она не на 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 и поместить туда свой собственный код. Очень часто пишут наш собственный класс. Но вы все еще хотите вар магии.