新しいプロジェクトのコアデータにSwiftボイラープレートコードを使用しています。私の_.xcdatamodeld
_ファイルには、単一の属性(Task
) name
)。
次のような_Task.Swift
_ファイルがあります。
_import CoreData
class Task: NSManagedObject {
@NSManaged var name: String
}
_
これを実行すると、動作します:
_var firstTask = NSEntityDescription.insertNewObjectForEntityForName("Task",
inManagedObjectContext: managedObjectContext) as NSManagedObject
firstTask.setPrimitiveValue("File my TPS reports", forKey: "name")
var error: NSError?
managedObjectContext.save(&error)
_
IOSシミュレーターで使用されているSQLiteデータベースにアクセスして、行が追加されたことを確認することもできます。
ただし、上記とまったく同じコードを実行するときに_as Task
_の代わりに_as NSManagedObject
_を使用すると、_var firstTask
_に関連付けられたエラーメッセージThread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
でクラッシュします…行。実行を継続すると、スレッド1を進めるたびに、スレッド1の上部に_EXC_BAD_ACCESS
_と_0 misaligned_stack_error_
_が表示されます。
なぜこのキャストがこれすべてにつながるのでしょうか?
クラス名フィールドが実際にModule。Taskであることを確認してください。ここでModuleはアプリの名前です。 SwiftのCoreDataクラスは名前空間です。現在、オブジェクトはタスクとしてではなくNSManagedObjectとしてコンテキストから引き出されているため、as-castは失敗しています。
Task.Swiftファイルを変更する必要があります。以下のように@objc(Task)を追加します
import CoreData
@objc(Task)
class Task: NSManagedObject {
@NSManaged var name: String
}
プロジェクトにObjective-Cコードが含まれていない場合、これはバグだと思います。ただし、これが修正されるまでその行を追加する必要があります。
ここから学んだ。
私はまだ次の例外を受け取っているため、.xcdatamodelのクラスフィールドのみを変更しても機能しないと思います:致命的なエラー:クラスの未実装の初期化子 'init(entity:insertIntoManagedObjectContext :)'の使用
そこで、カスタムコードに次のコードを入力しました。
init(entity: NSEntityDescription!,
insertIntoManagedObjectContext context: NSManagedObjectContext!) {
super.init(entity: entity, insertIntoManagedObjectContext: context)
}
突然、うまくいきました! NSManagedObjectは、カスタムクラスにダウンキャスト可能になりました。なぜこれが解決策なのか本当に理解できませんが、うまくいきます:)
@objc()を追加し、coredataインターフェースでクラスを設定する必要がありました。 CoreDataの右ウィンドウの[エンティティ]領域には、[名前]および[クラス]テキストボックスがあります。 クラスはMSManagedObjectではなく、クラスでなければなりません。 単純な作業例 !を作成しました
私はこの数日でこの問題に遭遇しましたが、奇妙なことに、私のために働いた解決策は上記で提案されたものの変形でした。
生成されたサブクラスに@objc宣言を追加しましたが、オブジェクトモデルのクラス名のネームスペースプレフィックスを削除しました(サブクラスが生成された後のデフォルトプレフィックスは「PRODUCT_MODULE_NAME。」でした)。うまくいきました。