はじめに
- Xcode 8 からは、 NSManagedObject のサブクラス(以下エンティティと記述)が、自動生成できます
- 以前のように、メニューから [Editor] -> [Create NSManagedObject Subclass...] として生成する必要がありません
- クラス定義をカスタマイズしたい場合には、自分で生成させることもできます
- 選択するオプションによって自動生成されるものが異なるので、そのまとめです
検証環境
- macOS Sierra 10.12.5
- Xcode 8.3.3
サンプル
- エンティティ名: Product
- 属性として name および price を持つ

自動生成されるファイル
- エンティティの Codegen プロパティにより、クラスとエクステンションのいずれか(もしくは両方)が生成されます
クラス定義(A)
- プロパティの宣言などはない、クラス定義部分です
Product+CoreDataClass.swift
import Foundation
import CoreData
@objc(Product)
public class Product: NSManagedObject {
}
エクステンション(B)
- フェッチリクエストを返すメソッドと、プロパティの宣言が追加されています
Product+CoreDataProperties.swift
import Foundation
import CoreData
extension Product {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Product> {
return NSFetchRequest<Product>(entityName: "Product")
}
@NSManaged public var name: String?
@NSManaged public var price: Int64
}
生成されたファイルはどこに?
- 以下の場所に生成されるようです
~/Library/Developer/Xcode/DerivedData/プロジェクト名-何らかの文字列/Build/Intermediates/プロジェクト名.build/Debug-iphonesimulator/プロジェクト名.build/DerivedSources/CoreDataGenerated/プロジェクト名/
Codegen プロパティ値と自動生成されるファイルの組み合わせ
Codegen の値 | 自動生成されるファイル | 備考 |
---|---|---|
Manual/None | - | これまで通り、自分で作成する必要あり |
Class Definition | A, B | 自分で作成する必要なし |
Category/Extension | B | クラス定義だけは、自分で作成する必要あり |
どう使い分けるか?
以下のような使い分けになりそうです
- エンティティのカスタマイズが必要: Manual/None, Category/Extension
-
awakeFromInsert()
やvalidateForInsert()
などをオーバーライドする場合など
-
- エンティティのカスタマイズが不要: Class Definition