web-dev-qa-db-ja.com

CoreDataジェネレーターを使用してDerivedDataフォルダー内のファイルを複製する

データモデルからNSManagedModelsを生成しようとしています。生成は動作しますが、多くのエラーが発生した後:

エラー:ファイル名 "Station + CoreDataProperties.Swift"が2回使用されています: '/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:注:ファイル名は、同じ名前のプライベート宣言を区別するために使用されます

ビルドフォルダとderivedDataディレクトリを完全に削除してみてください。 Xcode 8ベータ版を使用していますが、これはバグでしょうか?

42
Ludovic

Xcode 8.1でこれを取得します。次の手順に従って問題を解決しました。順序が重要であることに注意してください。

1)Core Dataモデルでエンティティを作成します。

2)クラスセクションで、次の図のように設定します。

モジュール:現在の製品名

コード生成:手動/なし

3)NSManagedObjectサブクラスを生成します。

enter image description here

69

この投稿は、この問題を自分で解決するのに大いに役立ちました。個人的には、これをXcodeのバグと見なしています。バグかどうか、これは巨大な鶏と卵の状況です。

私はこれに遭遇しました:

  1. コアデータを使用して新しいプロジェクトを作成しました
  2. NSManagedObjectサブクラス+拡張を生成しました(同時にcodegen: ClassDefinition
  3. 誤って生成されたクラスを間違ったフォルダーに保存しました
  4. 生成されたファイルを削除しました
  5. 欲しかったフォルダーで再生成
  6. ????-Xcode used twiceエラー

他の人が投稿したように、私は自分のビルド(およびclean build folder)のクリーニングを続けましたが、ビルドの問題は決して解決しませんでした。

NSManagedObjectで生成されたクラスをcodegen: ClassDefinitionで最初に作成したかどうかを最終的に把握しました。知らないうちに、鶏肉と卵の問題に閉じ込められています。

その後、自動生成されたクラスを削除しました思考再生成する必要があったため、削除しました。再生成すると、used twiceビルドエラーが再度表示されます。手動で../DerivedSources/CoreDataGenerated/Model/..に入り、duplicatesを削除しました。繰り返しになりますが、私は(自分のプロジェクトで)1つのコピーしか持っていないと思って再生成しましたが、間違っていました。 codegen: ClassDefinitionが最初に設定されていた場合、Xcodeはauto-generatedクラス+拡張機能を作成し続け、それらを埋め込みフォルダ../DerivedSources/CoreDataGenerated/Model/..に配置します。私はこの鶏肉と卵子を数回繰り返してから捕まえました。

後でcodegen: Manual/Noneをマークする必要があることに気付きましたが、同期を取り戻すには、../DerivedSources/CoreDataGenerated/Model/..およびプロジェクトがある場合はプロジェクトで自動生成されたファイルを削除する必要があります。

codegen: Manual/Noneの設定には注意してください。私にとっては、codegen: Manual/Nonestickではないので、少し注意が必要です。各エンティティがcodegen: Manual/Noneに設定されていることをダブル/トリプルチェックするには、エンティティ間を何度もクリックする必要がありました。 Thenファイルを自動生成します。この時点で、自動生成されたファイルの唯一のコピーは、../DerivedSources/CoreDataGenerated/Model/..ではなくプロジェクトにあるはずです。

最後に、これはバグだと思います。codegen: Manual/Noneを指定した場合、Xcodeがファイルを自動生成するとは思わないが、それでもプロジェクトにそれらを入れてしまうからです。設定がcodegen: ClassDefinitionの場合はさらに混乱します。Xcodeがファイルを埋もれたディレクトリに置くことを知っているのに、プロジェクトで使用できます。これで私の牛肉は、自動生成されたファイルはソース管理されていないので、コンピューターを変更する場合、新しいステーションでそれらを自動生成する必要があります。

これが誰かの助けになることを願っています!

乾杯!

11
kev

これは確かにバグではありません。 @Morrowlessが示唆しているように、クラス定義とプロパティ拡張の両方が作成されます。これが望ましくない場合は、Codegenbefore生成の下でManual/Noneを選択しますコード。コードが既に生成されている場合は、それらを削除して、Editor->Create NSManagedObject Subclass...もう一度メニューから(手動/なしを設定した後)。

下の図では、クラス名「連絡先」は私のプロジェクトに固有のものです。代わりにエンティティ名が表示されます。

enter image description here

8
oyalhi

codegen: ClassDefinitionを使用してCoreDataサブクラスを生成した場合、基本的にねじ込まれます。修正する唯一の方法は次のとおりです。

  1. CoreDataサブクラスを削除します。
  2. 派生データフォルダーを削除します。
  3. プロジェクトをクリーンアップします(CMD + K)。
  4. 新しいCoreDataサブクラスを生成します。今回はCodegen: Manual/NoneおよびModule: Current Product Moduleを選択します
5
100grams

これはバグではありません。 CodegenはこれらのファイルをDerivedDataフォルダーに生成するため、プロジェクトで再度作成する必要がないため、コンパイルエラーが発生します。

Xcode 8.0リリースノートから:

Xcodeは、Core Dataデータモデルのエンティティとプロパティのクラスまたはクラス拡張を自動的に生成します。自動コード生成は、エンティティごとに有効化および無効化され、Xcode 8ファイル形式を使用する新しいモデルのすべてのエンティティに対して有効化されます。この機能は、Xcode 8形式にアップグレードされたすべてのデータモデルで使用できます。 Xcodeがデータモデルのファイルインスペクターを使用して、データモデルに対してSwiftまたはObjective-Cコードを生成するかどうかを指定します。

エンティティの自動コード生成が有効になっている場合、Xcodeはエンティティのインスペクターで指定されたエンティティのクラスまたはクラス拡張を作成します。指定されたクラス名が使用され、ソースがプロジェクトの派生データに配置されます。 SwiftおよびObjective-Cの場合、これらのクラスはプロジェクトのコードから直接使用できます。Objective-Cの場合、追加のヘッダーファイルがモデル内の生成されたすべてのエンティティに対して作成されます。ヘッダーファイル名命名規則「DataModelName + CoreDataModel.h」に準拠しています。

ただし、データモデルインスペクターのcodegenプルダウンメニューでCategory/Extensionを選択した場合(モデルにロジックを追加するため):codegenはクラス定義とプロパティ拡張

解決策は、プロパティの拡張子(ClassName + CoreDataProperties.Swift)を単に削除することです。これでプロジェクトがコンパイルされます。

3
Morrowless

OyalhiとVladimir Shutyukのガイダンスに従って(NSManagedObjectファイルを削除し、エンティティcodegenManual/None)、NSManagedObjectファイルを再生成してコンパイルを成功させる前に、Xcodeを再起動してインデックスを再度作成する必要がありました。

0
Jacob Davis

完全を期すために..:

私はちょうど同じエラーに遭遇しましたが、提案された解決策はどれもうまくいきませんでした。私が困惑したのは、問題のあるエンティティの自動コード生成から手動への切り替えでさえ、何もしなかったことでした。

最後に、同じnameを持つエンティティが複数あることがわかりましたが、それらはすべて同じclassnameを共有しています。この理由は、いくつかの共通の属性もあるため、1つのエンティティを数回コピーして貼り付けて作業を節約したためです。

XCodeは、エンティティ名に1、2、...を追加して重複の名前を変更しますが、クラス名は以前のままにします。また、エンティティ名とクラス名は「無関係」であるため、エンティティの名前を変更してもクラス名は変更されません。

それが誰かを助けることを願っています-私はこれについてバグレポートも提出しました。

0
Toastor