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

Дублировать файлы в папке DerivedData с использованием генератора CoreData

Я пытаюсь создать NSManagedModels из моего datamodel. Поколение работает, но после многих ошибок:

error: имя файла "Station + CoreDataProperties.swift" используется дважды: '/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift' и '/Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station+CoreDataProperties.swift': 0: примечание: имена файлов используются для объявления с тем же именем

Я пытаюсь очистить папку сборки и файл производногоData hard delete. Я использую Xcode 8 BETA, возможно, это ошибка?

4b9b3361

Ответ 1

Я получаю это в Xcode 8.1 Для меня следующие шаги решили проблему. Обратите внимание, что порядок имеет значение.

1) Создайте объект в модели Core Data.

2) В разделе класса сделайте настройки как на следующем изображении.

Модуль: текущее название продукта

Codegen: Manual/None

3) Создайте подкласс NSManagedObject.

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

Ответ 2

Этот пост очень помог мне решить эту проблему самостоятельно. Лично я рассматриваю это как ошибку Xcode. Ошибка или нет, это огромная ситуация с курицей и яйцом.

Я столкнулся с этим:

  • Создал новый проект с использованием основных данных
  • Сгенерирован мой подкласс NSManagedObject + расширение (while codegen: ClassDefinition)
  • Я случайно сохранил сгенерированные классы в папке "Неправильно"
  • Я удалил сгенерированные файлы
  • Сгенерировано в папке, которую я хотел
  • 💥- Ошибки Xcode used twice

Как и другие публикации, я продолжал чистить мою сборку (и clean build folder), но никогда не исправлял проблему сборки.

Наконец-то я понял, если вы изначально создали свои NSManagedObject сгенерированные классы с помощью codegen: ClassDefinition, как я и сделал, не зная, что вы заперты для проблемы с курицей и яйцом.

Затем я удалил автогенерированные классы, которые мне пришлось перегенерировать, поэтому я и сделал. После повторного создания я снова получаю ошибку сборки used twice. Я вручную перешел в ../DerivedSources/CoreDataGenerated/Model/.. и удалил дубликаты. Опять же, я снова создал мысли, что у меня будет только 1 экземпляр (в моем проекте), но я ошибся. Если изначально был установлен codegen: ClassDefinition, то Xcode будет продолжать создавать классы auto-generated classes + extensions и помещать их в скрытую папку ../DerivedSources/CoreDataGenerated/Model/... Я повторил эту курицу и яйцо несколько раз, прежде чем ловить.

Позже я понял, что вам действительно нужно отмечать codegen: Manual/None, но чтобы синхронизировать все, вам нужно удалить автоматически сгенерированные файлы в ../DerivedSources/CoreDataGenerated/Model/.. и в вашем проекте, если у вас там все еще есть.

Будьте осторожны при настройке codegen: Manual/None, для меня это было немного сложно, потому что codegen: Manual/None не будет придерживаться. Я должен был щелкнуть назад и вперед между объектами несколько раз, чтобы выполнить двойную/тройную проверку, чтобы каждый объект был установлен на codegen: Manual/None. Затем автоматически создавайте файлы. На данный момент ваша единственная копия автоматически сгенерированных файлов должна быть в вашем проекте, а не в ../DerivedSources/CoreDataGenerated/Model/...

Наконец, я думаю, что это ошибка, потому что если вы укажете codegen: Manual/None, я не ожидаю, что Xcode будет автоматически генерировать файлы вообще, но это сделает и помещает их в ваш проект. Более запутанным, если ваша настройка codegen: ClassDefinition, кто знает, что Xcode поместит файлы в скрытый каталог, но он будет доступен для использования в вашем проекте. Моя говядина с этим - это автоматически созданные файлы, не контролируемые источником, и если я сменил компьютер, который я должен знать, чтобы автоматически генерировать их на новой станции.

Надеюсь, это поможет кому-то еще!

Ура!

Ответ 3

Это действительно не ошибка. Поскольку @Morrowless предлагает создание и определение класса, и расширение свойств. Если это не требуется, выберите Ручной/Нет в Codegen до, генерируя код. Если код уже сгенерирован, просто удалите его и повторите попытку Editor->Create NSManagedObject Subclass... из меню (после установки Manual/None).

Примечание. На приведенном ниже рисунке имя класса "Контакт" относится к моему проекту. Вместо этого вы увидите свое имя сущности.

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

Ответ 4

Если вы создали подклассы CoreData с codegen: ClassDefinition, вы в основном завинчивались. Единственный способ исправить это:

  • Удалите подклассы CoreData.
  • Удалите папку с производными данными.
  • Очистите проект (CMD + K).
  • Создайте новые подклассы CoreData, на этот раз выберите Codegen: Manual/None и Module: Current Product Module

Ответ 5

Это не ошибка. Codegen создает эти файлы в папке DerivedData, поэтому вам не нужно создавать их снова в своем проекте, следовательно, ошибка компиляции.

Из Xcode 8.0 Примечания к выпуску:

Xcode автоматически генерирует классы или расширения классов для объектов и свойств в модели данных основных данных. Автоматическая генерация кода включена и отключена на основе сущности по сущности и включена для всех объектов в новых моделях, которые используют формат файла Xcode 8. Эта функция доступна для любой модели данных, которая была обновлена ​​до формата Xcode 8. Вы указываете, генерирует ли Xcode код Swift или Objective-C для модели данных с помощью инспектора файлов моделей данных.

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

Однако, если вы выбрали Category/Extension в раскрывающемся меню codegen в инспекторе модели данных (потому что вы хотите добавить логику к своей модели): codegen будет ошибочно генерировать оба класса определение и расширение свойств.

Решение состоит в том, чтобы просто удалить расширение свойств ( ClassName + CoreDataProperties.swift). Теперь ваш проект должен компилироваться.

Ответ 6

Следуя указаниям oyalhi и Vladimir Shutyuk (удаляя файлы NSManagedObject, меняя сущность codegen на Manual/None), мне пришлось перезапустить Xcode, чтобы он мог индексироваться снова, прежде чем я мог бы повторно генерировать файлы NSManagedObject и получить успешную компиляцию.