web-dev-qa-db-ja.com

NSManagedObjectサブクラスを生成する自動コードでの無効な再宣言Swift 3

Xcodeのバージョン8.1を使用します。

.xcdatamodeldファイルに「MapRegionObject」という名前のエンティティを作成します。 enter image description here

自動コードジェネレーターを使用して、ナビゲーションバーの[エディター]をクリックし、[NSManagedOjectサブクラスを作成...]をクリックします。

MapRegionObject + CoreDataClass.SwiftとMapRegionObject + CoreDataPropertiesの2つのファイルを取得しました

スクリーンショットに表示されている2つのファイルのエラー:MapRegionObject + CoreDataClass.Swift enter image description here

MapRegionObject + CoreDataProperties enter image description here

このバグの修正を手伝ってください、ありがとうございました!

51
Summer Ji

Xcode 8.1では、自動コードジェネレーターを使用する前に、データモデルでエンティティを選択する必要があります。

Entity

次に、[データモデルインスペクター]タブに移動します。

Data Model Inspector

「Codegen」の下で「Manual/Node」を選択します

その後、エラーなしでNSManagedObjectサブクラスを作成できます。


または、既に「クラス定義」を使用している場合は、既存の。xcdatamodeldファイルに移動し、Codegenで現在のすべてのエンティティを「手動/なし」に設定できます。プロジェクトを必ず保存してください(ファイル->保存)、既存の派生データを削除し、プロジェクトをクリーンアップしてからビルドします。モデル全体を作り直すことなく、解決しました。

123
Kamillpg

私はこのこと全体が非常に紛らわしいと感じました。 CoreDataの新機能を本当に理解する必要があります。基本的に、デフォルトでは、〜/ Library/Developer/Xcode/DerivedDataにある「DerivedData」と呼ばれる場所にクラスと拡張機能が自動的に生成されます。コードソースの。個人的には、それらを開いて見ることができないことは私にとって奇妙ですが、慣れるには何かが必要です。

基本的に、CoreDataモデルに「AppSettings」というエンティティがある場合は、自分でコードを生成する必要なく、そのまま使用できます。プロジェクトにコードが必要な場合は、エンティティのCodegenプロパティをManual/Noneに設定します。次に、前に行ったことを行います。エディター-> NSManagedObjectクラスなどを作成します。ファイルはプロジェクトに追加されます。

良いニュースは、カスタム拡張機能を作成する場合は、プロジェクトでそれを行うだけです。 Xcodeは、プロジェクトディレクトリ外の他の場所から生成されたファイルを、プロジェクトディレクトリ内のファイルとブレンドします。

18
P. Ent

1)プロジェクトをクリーンアップします(cmd + shift + K)

2)以下のスクリーンショットのように、クラスの作成されたすべてのエンティティセット属性の「データモデルインスペクター」で

screenshot

3)コードを再度生成します(エディター-> NSManagedObjectサブクラスの作成)

その後、すべてが正常に動作するはずです。

7
Andrey

問題は、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」に準拠しています。

3
victor_luu

Xcode 8.2.1では、Menu-Product-Clean、そしてすべてが大丈夫です。

2
saneryee

プロジェクトを閉じて、次の指示に従います。

  1. Finderでデータベースの.xcdatamodeldファイルを表示します。
  2. .xcdatamodeldファイルで右クリック->パッケージの内容を表示、if(.xcdatamodel)がパッケージ内で再び見つかった場合は、右クリックして[パッケージの内容を表示]をクリックします。 「コンテンツ」ファイルを取得する必要があります。
  3. テキスト編集で「コンテンツ」を開きます。
  4. Command-F(codeGenerationType = "class")と一致するすべての文字列を空白文字列に置き換えます。

Xcodeプロジェクトを再度保存して開きます。すべて正常に動作するはずです。

2
Satendra dagar

この投稿は私の質問に非常に役立つことがわかりました。

コアデータの新機能Swift 3.

iOS 10(Swift 3)でコアデータを使用する方法

1
Summer Ji

実際に生成されたプロパティを変更する必要がない限り、Xcodeでこれと戦わないでください。

自動生成されたクラスは、アプリケーションの他のクラスと考えてください。管理対象オブジェクトクラスに機能を追加する必要がある場合は、クラス定義を拡張機能に変更し、オブジェクトを拡張するだけです。

クラスを変更:

class MyManagedObject : NSManagedObject { /* implementation*/ }

拡張子へ:

extension MyManagedObject { /* implementation */ }
1
Dan Beaulieu

これは答えではありません。それは選択で何が起こっているかの説明です

必ず確認してください コアデータスタンフォードコースのこの瞬間

以下は私が自分で書いたトランスクリプトです(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サブクラスを選択しないと、まだ機能しているように見えますが、 なしフードの下で何が起こっているかを示します。非常に直感的なカウンター!


次に、この Core Data Stanfordコース のライブデモもご覧ください。

これで、value/set(value:forKey :)を使用せずにこれらすべてにアクセスしたいことがわかりました... Users/Tweetsのサブクラスが必要です。そして、これらすべての関係にvar [ドット表記]が必要なので、そのコードを生成する必要があります。それを行う方法は、エンティティを選択するだけです...そして、ここからCodeGenに進みます。これはデフォルトでクラス定義を意味します。それはそれが終わったことを意味します。 Tweetというクラスを生成します。そして、varおよびすべての関係で動作します。それは実際に私たちが望むものではありません。この[カテゴリ/拡張]を選択します。 Tweetの拡張機能を作成し、varを追加するだけです。 これは、Tweetクラスを作成し、そこに独自のコードを配置するためです。独自のクラスを記述することは非常に一般的です。しかし、まだvarマジックが必要です。

0
Honey