エラーメッセージがコアデータファイルを参照している場合は、この回答をお読みください
概要:自動生成と手動生成の両方の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
根本的な原因は、Build Transcriptの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で追加されました。
2番目のファイルは同じ名前のファイルですが、Xcodeに埋め込まれていますDerivedData
。データファイル()ファイルがターゲットのソースのコンパイルビルドフェーズに含まれている場合、このファイルはビルドごとに Xcodeによって自動的に生成され.xcdatamodeld
ます。この機能はXcode 9で追加されました。Codegenポップアップの設定に応じて、エンティティ/クラスごとに0、1、または2つのファイルが生成されます。データモデルの編集中にエンティティを選択すると、そのポップアップはデータモデルインスペクターに表示されます…
設定は次のとおりです。
- 手動/なしファイルは生成されません
- カテゴリー/拡張子 1つのファイル、Foo + CoreDataProperties.mまたは.swiftが生成され、Objective-CカテゴリーまたはSwift拡張子が含まれます。
- クラス定義同じカテゴリ/拡張ファイルが生成され、さらにクラスの宣言と定義を含むFoo + CoreDataClass.mまたは.swiftが生成されます。
つまり、古いXcodeに慣れている開発者(私のような)が新しいXcodeでプロジェクトを開始すると問題が発生することがわかります。Codegenポップアップの設定によってXcodeが重複ファイルを作成していることに気づかずに、プロジェクトナビゲーターに表示できるファイルを作成するには、Create Managed Object Subclassメニュー項目を使用する必要があると考えています。 「巧妙に」は、プロジェクトナビゲーターには表示されません。これは、開発者が開発者を読んでヘッダーのコメントに耳を傾けることを信頼しないためです。
解決策1-古い方法を使用する
1つの設定だけで、データモデルのすべての自動Codegenを無効にすることができます。
- 問題のターゲットのビルドフェーズを開きます(Project Navigatorでプロジェクトを選択し、表示されるTARGETSのリストで問題のターゲットを選択して、[ ビルドフェーズ ]タブをクリックします)。
- [ ソースのコンパイル]エントリを展開し、問題のあるデータモデル(
.xcdatamodeld
ファイル)を見つけます。
- コンパイルリストから削除してください
- データモデルが[ バンドルリソースのコピー]リストに含まれていることを確認します。
ソリューション2-初心者のためのコアデータマジック
ここで、あなたは新しい方法ですべてに入ります。
- そのコンパイルソースのデータモデルはそのままにしておきます。
- データモデルの各エンティティインスペクターで、CodegenをClass Definitionに設定します。
- プロジェクトナビゲータでは、削除して、任意のゴミ箱のFoo + CoreDataClassのすべてのファイルを、名前の変更はFoo + CoreDataProperties.mまたは.swiftような何かにファイルをフー+ MyProperties。
- 各Foo + MyProperties.mまたは.swiftファイルで、Xcodeによって生成されたプロパティがある場合、これらのプロパティはCodegenによって作成された隠しファイルにあるため、削除します。
このソリューションでは、クラス定義は各ビルドのデータモデルから自動的に生成されます。あなたもそれらを見ることができません。それはコアデータのマジックであり、初心者には便利でシンプルです。
ソリューション3-ほとんどの実際のアプリ
しかし、管理されていないプロパティを本当に追加したい場合は、ソリューション2は役に立ちません。(Objective-Cでは、プロパティをカテゴリに追加できません。Swiftでは、保存されたプロパティを拡張機能に追加できません。)したがって、ほとんどの実際のアプリでは、ソリューション1と2の中間に行くことをお勧めします。
- コンパイルソースのリストにデータモデルを残す
- データモデルの各エンティティインスペクターで、CodegenをCategory / Extensionに設定します。
- プロジェクトナビゲータで、削除し、任意のゴミ箱のFoo + CoreDataClass.mまたは.swiftファイルを、そして、将来の混乱を軽減するために、任意の名前の変更はFoo + CoreDataProperties.mまたは.swift多分ちょうどにファイルをFoo.mか.swift。
- 各Foo.mまたは.swiftファイルにクラス定義が含まれていることを確認してください。クラス定義には、独自の非管理プロパティを追加できます。
(Positronによる回答への謝辞。ここでの私の回答は、Positronの回答(私のソリューション1)が機能する理由を説明し、ソリューション2とソリューション3を追加します。)