モデルでのクラス名の設定
xcdatamodeldでエンティティのクラス名にモジュール名のプレフィックスを付ける必要があります。アプリ名がMyApp、Entity名がPersonだとするとクラス名はMyApp.Personと設定します。
モジュール名を付けないとNSEntityDescription.insertNewObjectForEntityForNameが動作せず、コンテキストでフェッチしてもオブジェクトをサブクラスにキャストできませんでした。プレフィックスを付けるとフェッチしたオブジェクトのクラス名がMyApp.Personとなっていましたが、付けないとNSManagedObject_Person(の様な名前。うろおぼえです。)となっていました。
インスタンスの作成
let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context) as Person
もしくは
let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
let person = Person(entity: entity, insertIntoManagedObjectContext: context)
として作成します。
Fetch
フェッチではフェッチした後でキャストします。executeFetchRequestを実行する時にキャストしようとするとエラーになりました。
let request = NSFetchRequest(entityName: "Person")
let array = context.executeFetchRequest(request, error: nil)
let persons = array as? [Person]