Ошибка Core Codegen в Xcode 8
У меня есть приложение iOS, содержащее модель Core Data с 6 объектами. Объект Name
настраивается следующим образом:
Имя класса: Имя
Модуль: Текущий модуль продукта
Код: Определение класса
(все 5 других объектов настроены аналогично).
Проблема 1 (исправлена, но уходит на потомство)
Код IS сгенерирован в папке с производными данными... не как определения класса, как ожидалось, а в качестве расширений (назван как Name+CoreDataProperties.swift
. Кажется, не имеет значения, установлено ли Codegen для определения класса или категории/расширения - Я все равно получаю тот же результат.
ОК, держите эту мысль - внезапно генерируются как класс, так и файлы расширений ARE... похоже, что вам нужно удалить папку с производными данными проекта и перезапустить Xcode между обновлениями. Игнорировать проблему 1
Проблема 2
Сгенерированные файлы игнорируют модель данных. Необязательный флаг для атрибутов String и отношений - все они сгенерированы как опции
Проблема 3 (исправлена сама, но уходит на потомство)
Упорядоченные отношения генерируются как OrderedSet
(и ошибка компиляции), а не NSOrderedSet
(не могут изменять их по мере их создания)
Обходной путь для меня заключался в том, чтобы временно добавить в проект...
public typealias OrderedSet = NSOrderedSet
ОК, теперь ошибка компилятора исчезла, и OrderedSet
, похоже, распознается. Игнорировать проблему 3.
Проблема 4
Ничего из этого не имеет значения, потому что компилятор не может найти файлы, которые он только что сгенерировал. Для объекта Name
выше:
: 0: ошибка: нет такого файла или каталога: '/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated//.Name+CoreDataClass.swift': 0: ошибка: нет такого файла или каталога: '/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated//. Имя + CoreDataProperties.swift
Он ищет в производных данных для файлов .Name+CoreDataClass.swift
и .Name+CoreDataProperties.swift
- заметьте '.' в начале имен файлов. (В качестве временного исправления я добавил сгенерированные файлы в проект)
Я предполагаю, что я делаю что-то неправильно, как если бы это было так для всех, никто не смог бы построить проект Core Data... или эти ошибки, требующие повышения?
Приветствия
Ash
(Также поднят на форумах Apple dev)
Ответы
Ответ 1
Что касается Проблема 1, установка всплывающего окна Codegen в инспекторе для объекта в .xcdatamodel должна работать следующим образом:
Категория/Расширение сообщает Xcode генерировать один файл, ClassName + CoreDataGeneratedProperties.
Определение класса сообщает Xcode генерировать два файла, указанный выше файл плюс ClassName + CoreDataClass.
Однако в Xcode 8.2 появляется ошибка. Если после изменения одного из этих всплывающих окон вы просто создаете (⌘B) или Run (⌘R), ваши изменения не вступят в силу. Например, если вы изменили с Определение класса на Категория/Расширение и даже вручную удалили второй файл, он снова появится. Вы даже можете обнаружить, что всплывающее окно возвращается к исходной настройке.
Чтобы изменения в этих всплывающих окнах стали эффективными, вы должны
- Сохраните (⌘S) файл .xcdatamodel.
- Закройте все окна проекта.
- Откроем проект.
Во время следующей сборки (которая может произойти автоматически, когда проект открывается, если у вас есть @IBInspectable в раскадровке), затронутые файлы в Derived Data будут сгенерированы или удалены, чтобы соответствовать вашим новым настройкам.
ОБНОВЛЕНИЕ 2016-12-22: Спасибо за комментарий, Эшли. Я уже написал и представил это Apple Bug Reporter: 29789727. Обновление 2017-02-08: Apple закрыла 29789727, поскольку она якобы дублирует 21205277.
Ответ 2
Проблема 4 может быть исправлена (по крайней мере, в последней бета-версии, v. 6), выбрав все объекты, которые вы хотите автоматически сгенерировать, а затем в инспекторе, очистив поле Class- > Module, чтобы он по умолчанию был "Global Пространство имен".
Ответ 3
Что касается проблемы 2: флаг "Необязательный" Core Data не имеет ничего общего с концепцией Swift опционального. Они не связаны и не означают одно и то же. Маркировка атрибута Core Data как необязательного не означает, что он не является необязательным, поскольку Swift определяет этот термин. Разница заключается в следующем:
- Быстрые non-optionals должны иметь значения non-nil в любое время.
- Необязательные данные Core Data должны иметь значения non-nil при сохранении изменений, но Core Data не знает и не заботится о том, являются ли они ноль в другое время.
Проблема № 4 звучит, как Xcode, сбивает ее состояние с путаницы и может быть исправлено voodoo, как ручная очистка папки с производными данными (опять же, я знаю). В настоящее время я не могу воспроизвести его, но это не значит, что это не ошибка в текущей бета-версии.
Ответ 4
На самом деле это довольно легко исправить.
Перейдите к настройке:
![введите описание изображения здесь]()
Затем удалите точки. Они существуют только в более старых проектах.
Операторы импорта фиксируются после этого, и вам хорошо идти.
Вы также должны поместить свои модели в глобальное пространство имен. Моя была в дополнительном пространстве имен, но я понятия не имею, почему.
Ячейки утверждают, что вы можете использовать это в пользовательской структуре.
Эта функция довольно приятная, если вы ее работаете;)
Ответ 5
Похоже, что Xcode 8.2.1 не отключит codegen.
Но вы можете вручную удалить codeGenerationType="category"
из файла содержимого .xcdatamodel.
Закройте Xcode, удалите codeGenerationType
, удалите папку DerivedData и перестройте.
Ожидает исправления в будущих выпусках.
Ответ 6
Я полностью застрял в Задаче 4, и ни одно из вышеперечисленных не работало для меня. Я использую генерацию кода. Чтобы решить эту проблему, я сделал следующие шаги:
- Я открыл файл .xcdatamodel/content в текстовом редакторе. (В Xcode щелкните правой кнопкой мыши свой .xcdatamodel и выберите "Открыть во внешнем редакторе"
- В файле XML я убедился, что каждый объект имеет
codeGenerationType="class"
- Закрыть и вновь открыть Xcode Очистить папку с данными derrived
- Он по-прежнему отказывается выполнять Генерирование кода, поэтому я сгенерировал каждую Entity вручную (редактор, Create NSManageObject Subclasses, выберите все сущности)
- Создайте проект. Теперь также появились ошибки генерации кода и компилятора, говорящие, что имена файлов Entity использовались дважды.
- Удалены создаваемые вручную подклассы NSManagedObject, созданные на шаге 5.
- После этого проект был успешно создан и проблема исчезла.
PS: Если вы решите вручную создать подклассы NSManageObject, а затем с помощью генерации кода, то убедитесь, что вы удалили codeGenerationType="class"
из своих объектов в XML файле на шаге 2.