Прочтите этот ответ, если сообщение об ошибке ссылается на файлы базовых данных
Резюме: у вас могут быть как автоматически сгенерированные, так и сгенерированные вручную файлы классов управляемых объектов Core Data.
Этот ответ применяется, если первая строка ошибки относится к файлу Foo + CoreDataProperties.o или Foo + CoreDataClass.o .Пример:
error: Multiple commands produce '/Users/me/Library/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/ MyApp /Debug-iphonesimulator/ MyApp.build/Objects-normal/x86_64/Foo+CoreDataProperties.o':
1) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
2) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files
Первопричину можно увидеть, расширив Compile Swift SourceФайлы раздел стенограммы сборки.Например:
<unknown>:0: error: filename "Address+CoreDataClass.swift" used twice: '/Users/myUserName/Projects/Jnky/Foo+CoreDataProperties' and '/Users/jk/myUserName/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/MyApp.build/Debug/MyApp.build/DerivedSources/CoreDataGenerated/Jnky/Foo+CoreDataProperties.swift'
Первый упомянутый файл - это исходный файл в каталоге вашего проекта, который кто-то сгенерировал, выбрав вашу модель данных в Навигаторе проектов и щелкнув в меню Редактор > Создание подкласса управляемых объектов .Эта функция была добавлена в Xcode 7 или около того.
Второй файл - это файл с тем же именем, но скрытый в Xcode's DerivedData
.Этот файл автоматически генерируется Xcode во время каждой сборки , если файл модели данных (.xcdatamodeld
) включен в целевую фазу сборки Compile Sources .Эта функция была добавлена в Xcode 9 или около того.Ноль, один или два файла генерируются для каждого объекта / класса, в зависимости от настройки всплывающего окна Codegen .Это всплывающее окно находится в Инспекторе моделей данных , когда вы выбираете объект при редактировании своей модели данных…
Настройки:
- Вручную / нет Файлы не создаются
- Категория / расширение Один файл, Foo + CoreDataProperties.m или .swift создается с категорией Objective-C или расширением Swift.
- Определение класса Генерируется тот же файл категории / расширения, а также Foo + CoreDataClass.m или .swift , содержащий объявление и определение класса.
Таким образом, вы видите, что проблема возникает, когда разработчик (как я)) который привык к старому Xcode, начинает проект в более новом Xcode.Мы думаем, что нам нужно использовать пункт меню Создать управляемый объект , который мы делаем, для создания файлов, которые мы видим в Навигаторе проекта, не осознавая, что наши настройки в Codegen всплывающие окна заставляют XCode создавать дубликаты файлов, которые Apple "ловко" не показывает в Навигаторе проектов, потому что они не доверяют разработчикам читать и обращать внимание на комментарий в заголовке //Этот файл был сгенерирован автоматически и не должен редактироваться.
Решение 1. Использовать старый способ
Вы можете отключить все автоматические Codegen для модели данных столько одна настройка:
- Открыть задачу Фазы сборки (В Навигатор проектов , выбрать проект, затем в списке TARGETS появляется, выберите цель проблемы, затем вкладку Фазы сборки ).
- Разверните запись Компилировать источники и найдите модель данных проблемы (файл
.xcdatamodeld
). - Удалите его из списка компиляции
- Убедитесь, что модель данных включена в список Ресурсы комплекта копирования .
Решение 2 - Базовое волшебство данных для начинающих
Здесь вы идете олл-ин по-новому.
- Оставьте вашу модель данных такой, какая есть в Компиляции источников .
- В каждомEntity Inspector в вашей модели данных установите Codegen на Определение класса .
- В Project Navigator удалите и удалите все файлы Foo + CoreDataClass и переименуйте любые Foo + CoreDataProperties.m или .swift файлы в нечто вроде Foo + MyProperties .
- В каждом файле Foo + MyProperties.m или .swift , если есть свойства, сгенерированные Xcode, удалите эти свойства, поскольку они будут в скрытых файлах, созданных Codegen .
С этим решением ваши определения классов генерируются автоматически из модели данных каждой сборки.Вы даже не можете их видеть.Это Core Data Magic , приятное и простое для начинающих.
Решение 3 - для большинства реальных приложений
Но Решение 2 не очень хорошо, если вы действительно хотитедобавить неуправляемые свойства.(Objective-C не позволяет добавлять свойства в категориях, а Swift не позволяет добавлять сохраненные свойства в расширениях.) Поэтому в большинстве реальных приложений вы, вероятно, захотите пойти на полпути между решениями 1 и 2…
- Оставьте свою модель данных в списке Источники компиляции
- В каждом Entity Inspector в вашей модели данных установите Codegen на Категория / расширение .
- В Навигаторе проектов удалите и удалите все файлы Foo + CoreDataClass.m или .swift и, чтобы избежать путаницы в будущемпереименуйте любые Foo + CoreDataProperties.m или .swift файлы, например, Foo.m или .swift .
- Убедитесь, что каждый файл Foo.m или .swift содержит определение класса, к которому вы можете добавить свои собственные неуправляемые свойства.
(Благодарность ответу Позитрона. Мой ответ здесь объясняет, почему ответ Позитрона (мое Решение 1) работает,и добавляет Решение 2 и Решение 3.)