LoginSignup
7
7

More than 5 years have passed since last update.

Xcode 8 で自動生成される Core Data エンティティのソースファイル

Posted at

はじめに

  • Xcode 8 からは、 NSManagedObject のサブクラス(以下エンティティと記述)が、自動生成できます
  • 以前のように、メニューから [Editor] -> [Create NSManagedObject Subclass...] として生成する必要がありません
    • クラス定義をカスタマイズしたい場合には、自分で生成させることもできます
  • 選択するオプションによって自動生成されるものが異なるので、そのまとめです

検証環境

  • macOS Sierra 10.12.5
  • Xcode 8.3.3

サンプル

  • エンティティ名: Product
    • 属性として name および price を持つ

datamodel.png

自動生成されるファイル

  • エンティティの 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
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7