Прочитайте цю відповідь, якщо повідомлення про помилку посилається на файли Core Data
Синопсис: у вас можуть бути як автоматично генеровані, так і генеровані вручну файли класу об'єктів, керовані 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 Files у складі стенограми. Наприклад:
<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 DerivedData
. Цей файл автоматично генерується Xcode під час кожної збірки, якщо .xcdatamodeld
файл моделі даних ( ) включений у фазу збірки джерел компіляції джерел цілі . Ця функція була додана в Xcode 9 або близько того. Нульовий, один або два файли створюються для кожної сутності / класу, залежно від налаштування спливаючого кодексу . Це спливаюче вікно знаходиться в Інспекторі моделей даних, коли ви вибираєте сутність під час редагування моделі даних ...
Налаштування:
- Вручну / Ні. Файли не створюються
- Категорія / Розширення Створюється один файл, Foo + CoreDataProperties.m або .swift , що містить розширення Objective-C або Swift.
- Визначення класу Створюється той самий файл категорії / розширення, а крім того створюється Foo + CoreDataClass.m або .swift , що містить декларацію класу та визначення.
Отже, ви бачите, що проблема виникає тоді, коли розробник (як я), який звик до старих Xcode, починає проект у більш новій Xcode. Ми вважаємо, що нам потрібно використовувати пункт меню Створений підклас керованого об’єкта , який ми робимо, для створення файлів, які ми можемо бачити в Навігаторі проектів, не розуміючи, що наші параметри в спливаючому вікні Codegen викликають Xcode для створення дублікатів файлів, які Apple "Розумно" не відображається в Навігаторі проектів, оскільки вони не довіряють розробникам читати та прислухатися до коментарів у заголовку // Цей файл автоматично генерується та не повинен редагуватися.
Рішення 1 - Використовуйте старіший шлях
Ви можете відключити всі автоматичні Codegen для моделі даних лише одним налаштуванням:
- Відкрийте етапи збирання проблеми (у «Навігаторі проектів» виберіть проект, потім у списку ЦІЛІВ, який з’явиться, виберіть ціль проблеми, а потім вкладку « Фази збірки» ).
- Розгорніть запис « Збірник джерел» і знайдіть модель (
.xcdatamodeld
файл) проблемних даних .
- Видаліть його зі списку компіляцій
- Переконайтесь, що модель даних включена до списку Копіювати ресурси ресурсів .
Рішення 2 - Основна магія даних для початківців
Ось, ви все підете новішим шляхом.
- Залиште свою модель даних такою, яка є в цих джерелах компіляції .
- У кожному інспекторі суб'єктів у вашій моделі даних встановіть Codegen на визначення класу .
- У «Навігаторі проектів» видаліть і сміття будь- яких файлів Foo + CoreDataClass і перейменуйте будь-які файли Foo + CoreDataProperties.m або .swift у щось на зразок Foo + MyProperties .
- У кожному файлі Foo + MyProperties.m або .swift , якщо є властивості, згенеровані Xcode, видаліть ці властивості, оскільки вони будуть знаходитись у прихованих файлах, створених Codegen .
За допомогою цього рішення визначення вашого класу генеруються автоматично з моделі даних про кожну збірку. Ви навіть не можете їх побачити. Це основна магія даних , приємна та проста для початківців.
Рішення 3 - для більшості додатків у реальному світі
Але рішення 2 не корисне, якщо ви дійсно хочете додати не керовані властивості. (Objective-C не дозволяє додавати властивості в категорії, а Swift не дозволяє додавати збережені властивості в розширення.) Тому в більшості реальних програм ви, ймовірно, хочете пройти на півдорозі між Рішеннями 1 і 2 ...
- Залиште свою модель даних у списку джерел компіляції
- У кожному інспекторі суб'єктів у вашій моделі даних встановіть Codegen на категорію / розширення .
- У Project Navigator, видаляти і сміття будь Foo + CoreDataClass.m або .swift файлів, і, щоб зменшити плутанину в майбутньому, перейменувати будь-який Foo + CoreDataProperties.m або .swift файли можливо тільки Foo.m або .swift .
- Переконайтесь, що кожен файл Foo.m або .swift містить визначення класу, до якого ви можете додати свої власні не керовані властивості.
(Подяка за відповідь Positron. У моїй відповіді тут пояснюється, чому відповідь Позитрона (мій розчин 1) працює, і додає рішення 2 та рішення 3.)