Ошибка 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.