Xcodeのバージョン8.1を使用します。
.xcdatamodeldファイルに「MapRegionObject」という名前のエンティティを作成します。
自動コードジェネレーターを使用して、ナビゲーションバーの[エディター]をクリックし、[NSManagedOjectサブクラスを作成...]をクリックします。
MapRegionObject + CoreDataClass.SwiftとMapRegionObject + CoreDataPropertiesの2つのファイルを取得しました
スクリーンショットに表示されている2つのファイルのエラー:MapRegionObject + CoreDataClass.Swift
MapRegionObject + CoreDataProperties
このバグの修正を手伝ってください、ありがとうございました!
Xcode 8.1では、自動コードジェネレーターを使用する前に、データモデルでエンティティを選択する必要があります。
次に、[データモデルインスペクター]タブに移動します。
「Codegen」の下で「Manual/Node」を選択します
その後、エラーなしでNSManagedObject
サブクラスを作成できます。
または、既に「クラス定義」を使用している場合は、既存の。xcdatamodeldファイルに移動し、Codegenで現在のすべてのエンティティを「手動/なし」に設定できます。プロジェクトを必ず保存してください(ファイル->保存)、既存の派生データを削除し、プロジェクトをクリーンアップしてからビルドします。モデル全体を作り直すことなく、解決しました。
私はこのこと全体が非常に紛らわしいと感じました。 CoreDataの新機能を本当に理解する必要があります。基本的に、デフォルトでは、〜/ Library/Developer/Xcode/DerivedDataにある「DerivedData」と呼ばれる場所にクラスと拡張機能が自動的に生成されます。コードソースの。個人的には、それらを開いて見ることができないことは私にとって奇妙ですが、慣れるには何かが必要です。
基本的に、CoreDataモデルに「AppSettings」というエンティティがある場合は、自分でコードを生成する必要なく、そのまま使用できます。プロジェクトにコードが必要な場合は、エンティティのCodegenプロパティをManual/Noneに設定します。次に、前に行ったことを行います。エディター-> NSManagedObjectクラスなどを作成します。ファイルはプロジェクトに追加されます。
良いニュースは、カスタム拡張機能を作成する場合は、プロジェクトでそれを行うだけです。 Xcodeは、プロジェクトディレクトリ外の他の場所から生成されたファイルを、プロジェクトディレクトリ内のファイルとブレンドします。
問題は、NSManagedObjectModelサブクラスを手動で生成する必要がなくなったことです。参照: https://forums.developer.Apple.com/thread/48988
Xcodeは、Core Dataデータモデルのエンティティとプロパティのクラスまたはクラス拡張を自動的に生成します。自動コード生成は、エンティティごとに有効化および無効化され、Xcode 8ファイル形式を使用する新しいモデルのすべてのエンティティに対して有効化されます。この機能は、Xcode 8形式にアップグレードされたすべてのデータモデルで使用できます。 Xcodeは、データモデルのファイルインスペクターを使用して、データモデルのSwiftまたはObjective-Cコードを生成するかどうかを指定します。エンティティに対して自動コード生成が有効な場合、Xcodeはエンティティのインスペクターで指定されたエンティティ:指定されたクラス名が使用され、ソースがプロジェクトの派生データに配置されます。SwiftとObjective-Cの両方で、これらのクラスはプロジェクトのコード:Objective-Cの場合、モデルで生成されたすべてのエンティティに対して追加のヘッダーファイルが作成されます:ファイル名は、命名規則「DataModelName + CoreDataModel.h」に準拠しています。
Xcode 8.2.1では、Menu-Product-Clean、そしてすべてが大丈夫です。
プロジェクトを閉じて、次の指示に従います。
Xcodeプロジェクトを再度保存して開きます。すべて正常に動作するはずです。
実際に生成されたプロパティを変更する必要がない限り、Xcodeでこれと戦わないでください。
自動生成されたクラスは、アプリケーションの他のクラスと考えてください。管理対象オブジェクトクラスに機能を追加する必要がある場合は、クラス定義を拡張機能に変更し、オブジェクトを拡張するだけです。
クラスを変更:
class MyManagedObject : NSManagedObject { /* implementation*/ }
拡張子へ:
extension MyManagedObject { /* implementation */ }
これは答えではありません。それは選択で何が起こっているかの説明です
以下は私が自分で書いたトランスクリプトです(100%正確ではありません):
これを選択した場合、デフォルトは_
class definition
_です。そのサブクラスが生成され、機能します。 Tweetというクラスとしてツイートにアクセスできるようになります。これはいいですね。ところで、これを行うとファイルナビゲータに表示されませんになります。最も頻繁に選択するのは_
category/extension
_です。これにより、Tweetクラスの拡張のみが生成されます。実際にTweetクラス自体を作成する必要があります。拡張機能は、すべての変数を作成します。再びカテゴリ/拡張子に切り替えてもナビゲーターにその拡張子が表示されない。それはあなたから隠されているようなものです。そして、なぜ私たちはこれが好きですか?多くの場合、独自のコードを追加したいからです。ツイートのように、Twitterからデータを取得してデータベース内のツイートに変換する静的メソッドを追加するとします。コードはどこに配置しますか?そのようなコードを置くのに最適な場所は、Tweetクラスにあります...そのようなことがあれば...そして拡張機能がすべてのvarビジネスを処理します。
Codegenに_
manual/none
_を選択した場合。つまり、コード生成を一切行わないということは、value/setValue(forKey:)
...を行うことになります。幸運なことに、コードはめちゃくちゃになるでしょう。 [つまり_.propertyName = value
_がありません...setValue(value, forKey: propertyName)
]を実行する必要がありました。
簡単に言えば、理由はわかりませんが、何らかの理由でcreate NSManagedObject
サブクラスを選択しないと、まだ機能しているように見えますが、 なしフードの下で何が起こっているかを示します。非常に直感的なカウンター!
これで、value/set(value:forKey :)を使用せずにこれらすべてにアクセスしたいことがわかりました... Users/Tweetsのサブクラスが必要です。そして、これらすべての関係にvar [ドット表記]が必要なので、そのコードを生成する必要があります。それを行う方法は、エンティティを選択するだけです...そして、ここからCodeGenに進みます。これはデフォルトでクラス定義を意味します。それはそれが終わったことを意味します。 Tweetというクラスを生成します。そして、varおよびすべての関係で動作します。それは実際に私たちが望むものではありません。この[カテゴリ/拡張]を選択します。 Tweetの拡張機能を作成し、varを追加するだけです。 これは、Tweetクラスを作成し、そこに独自のコードを配置するためです。独自のクラスを記述することは非常に一般的です。しかし、まだvarマジックが必要です。