Программа не компилируется после создания подклассов NSManagedObject - PullRequest
0 голосов
/ 15 ноября 2018

Когда я создаю подклассы NSManagedObject, программа не хочет компилировать с одной некатегоризированной ошибкой -

"Command CompileSwiftSources failed with a nonzero exit code" 

, а также создает одну ошибку для каждого файла подкласса, говоря, что "

Multiple commands produce '/Users/myName/Library/Developer/Xcode/DerivedData/CoreDataError-cqtxdlgmsibvltbxuxzvrapubhlp/Build/Intermediates.noindex/CoreDataError.build/Debug-iphonesimulator/CoreDataError.build/Objects-normal/x86_64/Person+CoreDataProperties.o':

Вот моя модель данных. enter image description here My data model

Это журнал ошибок enter image description here

Я пытался изменить настройки сборки на Legacy Build System, но это тоже не помогло.

1 Ответ

0 голосов
/ 12 мая 2019

В большинстве случаев это происходит, когда вы действительно создаете классы NSManagedObject (или их свойства) дважды.

В вашем случае вы создали код для классов Friend и Person благодаря меню Editor.команда.Затем вы интегрировали эти модули в свой проект.Таким образом, компилятор компилирует эти классы.

НО

Скорее всего, вы не изменили параметр генерации класса CoreData.Вы можете найти эту опцию на панели CoreData инспектора (раздел Class, меню Codegen).Может принимать 3 значения: «Вручную / Нет», «Определение класса» или «Категория / расширение».

Я полагаю, что вы остались со стандартным «Определением класса», что означает, что когда XCode компилирует вашу модель,он временно генерирует быстрые модули для каждой вашей сущности и компилирует эти модули.Таким образом, вы получите 2 модуля с именем «Друг» и 2 модуля с именем «Персона».Следовательно, ошибка.

Если вы хотите использовать сгенерированные редактором модули, скорее всего потому, что вы хотите изменить их, тогда вам следует установить в меню Codegen значение «Manual / None» или «Category / extension».Вы можете сделать это для каждой индивидуальной сущности.

Некоторые согласованные варианты использования:

  • У вас есть сущность, и вы просто не хотите ничего трогать: класс «keep»Определение "как выбор Codegen и не генерируйте код класса с помощью редактора, пусть XCode сделает все.
  • У вас есть сущность, и вы хотите изменить ее, например, вы хотите добавить руководство awakeFromInsertкод.Однако вы хотите, чтобы XCode продолжал генерировать средства доступа для атрибутов при их изменении.Сгенерируйте код для модуля, включите его в свой проект (но не в расширение для атрибутов), измените его, но оставьте «Category / extension» в качестве опции генерации.
  • Вы хотите управлять всем самостоятельно:сгенерируйте код объекта один раз, включите его в свой проект и выберите «Manual / None».Теперь позаботьтесь о том, чтобы при изменении некоторых атрибутов / отношений вам приходилось поддерживать синхронизацию кода вручную.
...