web-dev-qa-db-ja.com

コアデータ:タイプ 'MyType_MyType_2'の値をMyTypeにキャストできませんでした

Objective-CモデルクラスMyTypeがあります。このクラスはSwiftコードで使用されます:

NSEntityDescription.insertNewObjectForEntityForName("MyType", inManagedObjectContext: context) as! MyType

as!キャストするとエラーメッセージが表示されます

Core Data: Could not cast value of type 'MyType_MyType_2' (0x7be99a30) to MyType (0xf33db74).

私がNSManagedObjectとしてキャストした場合、それは機能します。結果を出力すると、それでもMyTypeの実際のインスタンスであることがわかります。

<MyType: 0x7ae06d50> (entity: MyType; id: 0x7aeba6d0 <x-coredata:///MyType/t957F2860-85F8-46E0-B6D6-4D1DF6C4EC613> ; data: { 
    ...the fields...
})

ここで何が起きてるの?そして、名前MyType_MyType_2 から来る?

28
Bastian

この問題が発生したのは、エンティティに「クラス」を設定するのを忘れていたためです。これは私が思いついたものです:

  1. ファイル構造/プロジェクトナビゲーターペイン(左端)で.xcdatamodelIdファイルをクリックします。
  2. 問題が発生しているエンティティを選択します。
  3. ユーティリティペイン(右端)で、1997年の携帯電話のようなアイコンであるデータモデルインスペクタを探します。
  4. エンティティ設定の下に、「名前」と「クラス」の2つのフィールドが表示されます。「クラス」には、使用しているクラスの名前(通常は「名前」と同じ)を設定します。

これらの手順を実行する前に、デフォルトの「クラス」がNSObjectであり、エラーメッセージを反映していることに気付くでしょう。これを行うためのプログラム的な方法もいくつか見つけましたが、これは最も簡単で最も速い解決策のように見えました。

私のモデルはSwiftで作成されているため、@ zellbで言及されている@objc(Entity)相互運用性リファレンスを追加する必要があったことに注意してください。ただし、その部分を適切に実行している限り、ソリューションに違いが生じることはありません(私の理解とは関係のない別のエラーが発生します)。

39
Bourne
  1. エンティティクラス名を設定
  2. モジュール「現在の製品モジュール」を以下のように設定します

enter image description here

33
Cody

これを試してください:

@objc(MyType)
public class MyType: NSManagedObject {
    // your class
}

これの代わりに:

class MyType: NSManagedObject {
    // your class
}
5
wajih

エンティティセクションのデータモデルインスペクタで、エンティティの1つに誤って「親エンティティ」を設定しました。私はそれが1対多の関係の宛先を指していると誤って考えました。

「親エンティティなし」に戻すと問題が解決しましたが、混乱したコアデータデータベースを処理するために、アプリをシミュレーターから削除して再インストールする必要がありました。

0
Darrell Root