コアデータを追加しようとしています。そして、同じエラーが発生するたびに:
error: filename "EntityName +CoreDataClass.Swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.Swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.Swift'
次の手順を使用してコアデータを追加します。
1。新しいファイル/ DataModel;私のプロジェクトのルートディレクトリに保存します
Model.xcdatamodeldを選択してエンティティを追加し、いくつかの属性を追加し、NSManagedObjectClassサブクラスを保存、編集/作成します。
その結果、ナビゲーターに4つの新しいファイルがあります:Model.xcdatamodeld、EntityName + CoreDataProperties.Swift、EntityName + CoreDataClass.Swift、_ COREDATA_DATAMODELNAME _ + CoreDataModel.Swift
その内容:_ COREDATA_DATAMODELNAME _ + CoreDataModel.Swift:
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.Swift:
import Foundation
import CoreData
class EntityName: NSManagedObject {
}
EntityName + CoreDataProperties.Swift:
import Foundation
import CoreData
extension EntityName {
@nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > {
return NSFetchRequest< EntityName >(entityName: "EntityName");
}
@NSManaged var str: String?
}
私が試したもの:
1。ビルドのクリーンアップ、DerivedDataの削除、var/foldersのコンテンツの削除、再起動
2。ナビゲーターに表示された生成されたファイルを削除する
私の努力はすべて運が悪かった。
私が間違っていることは何ですか?
Xcode 8には、モデルファイルがXcode 8ファイル形式を使用する場合のNSManagedObject
クラスの自動生成が含まれます。独自のサブクラスファイルを作成すると、複製が作成されます。エラーメッセージのDerivedSources
にある2番目のファイルは、Xcodeが自動的に作成したファイルです。
自動的に生成されたファイルが必要な処理を行う場合は、独自のファイルの作成を停止するだけでかまいません。
代わりに独自のサブクラスを作成する場合は、次のいずれかを実行できます
XCode 8には2つのバグがあります:
1-Codegenドロップダウンを変更した場合、新しい値はModel.xcdatamodelに保存されません。保存するには、他の何かを変更する必要があります。たとえば、クラス名を変更します。ビルド;クラス名を元に戻します。再度ビルドします。
2-生成されたコードはIntermediatesフォルダーのDerivedDataに配置されますが、フォルダーがまだ存在しない場合にのみ発生します。回避策は、クリーンにしてからビルドすることです。
私は実際に同じ問題を抱えており(Swiftを使用)、それがバグであると疑っています。私が正しく理解している場合、OPはXcodeのautogen NSManagedObjectサブクラスを使用しており、その後、混乱の原因と思われる追加の(不要な)サブクラスを作成しません。
再現する手順:
新しいプロジェクト、シングルビューアプリケーションを作成します。 「コアデータを使用」にチェックマークを付けます
モデルエンティティにエンティティを作成し、プロパティを追加し、ファイルが保存されていることを確認します(明示的に保存されていない場合、Xcode 8 Betaはデータをスローする場合があります)
Xcodeは3つのファイルを作成します。
COREDATA_DATAMODELNAME _+ CoreDataModel.Swift。このファイルは破損しており、FoundationおよびCoreDataをインポートするステートメントに続く無効なエントリが含まれています-このファイルを削除しないとプロジェクトはコンパイルされません
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.Swift
EntityName + CoreDataProperties.Swift
エディターはこの時点でエラーにフラグを立てませんが、OPにリストされた理由でコンパイルに失敗します(つまり、DerivedDataフォルダーに同じ名前で '。'プレフィックスが付いたファイルが見つかりません)
Xcodeの明らかにバグのある自動生成を使用せずにモデルを作成した後、NSManagedObjectサブクラスを手動で作成する場合、問題はありません。もう少しタイピングしますが、ずっと信頼できます!ただし、「クリーンな」プロジェクトから開始する必要があります(つまり、サブクラスを自動生成しようとする前)。そうしないと、エラーが続きます。派生データを削除しても、残念なことにはなりません。
*****更新*****かなり奇妙なことが起こっているように見え、元々提案されていたようにサイレントコード生成が行われているように見えます(謝罪)が、これは予想とは非常に異なる動作です。さらに、このコードはエディターでは表示されません(これは少し無意味で混乱しやすいようです)。 DerivedData> Build> Intermediates> .Buildのサブフォルダーに作成されます。
OPが混乱した理由を完全に見ることができます(私がそうだったように!)この「機能」の価値があるのは間違いなく役立つことですが、以前の動作に慣れていて生成するオプションが提供されている場合はやや混乱していますメインメニューから表示可能で編集可能な複製。
そのため、Codegenウィンドウ(以下に示す)で[Manual/None]を選択すると、メニューバーでauto-genオプションを使用するか( 'junk'を削除した後)、独自のコードを記述できます。
次の手順を実行します、
エンティティの「Codegen」設定を「Manual/None」に設定して、各エンティティの自動生成を個別に無効にします。
エンティティ名を別の名前に変更して保存します。たとえば、クラス名を変更します。ビルド;クラス名を元に戻します。再度ビルドします。
このエラーが出ました
ファイル.xcdatamodeldでツールバージョンをXcode 7.3に変更するだけです。
そしてそれはうまくいきます!
投稿されたいくつかの回答を試した後、マシンを再起動するとうまくいきました。
トム・ハリントン答えは正しいです。ただし、上記の2つのオプションを実行せずに、独自の関数や変数を追加する方法があります。
ただクラスの拡張を作成する。 (Swiftファイルには、自動生成された標準のNSManagesObjectファイルとは異なる名前を付けてください。)
例えば。 MyEntity
というエンティティがある場合は、SwiftファイルMyEntityExtension.Swift
これは次のようになります。
import Foundation
import CoreData
import UIKit
extension MyEntity {
var color: UIColor {
get {
return self.colorValue as! UIColor
}
set {
if newValue.isMember(of: UIColor.self) {
self.colorValue = newValue
}
}
}
}
Autogenの動作に問題があるすべての人のために:
エンティティのユーザー情報設定で「com.Apple.syncservices.Syncable」を「NO」に設定する必要がありました。
たぶんそれが役立ちます。
[ビルドフェーズ]タブの[ソースのコンパイル]タブでコンパイルファイルのコアデータを削除します-