为核心数据实体添加便利初始化程序

时间:2017-04-10 20:56:48

标签: ios core-data swift3

在Swift 3 / Xcode 8中,如何为Core Data实体创建便利初始化程序?现在我有一个普通的类,并使用一个方便的初始化器来保存来自JSON的数据,如下所示:

convenience init?(json: [String: Any]) {
    let id = json["id"] as! Int
    let title = json["title"] as! String
    let subtitle = json["subtitle"] as? String

    self.init(
        anId: id,
        aTitle: title,
        aSubtitle: subtitle,
    )
}

是否有一种简单的方法可以将这样的内容添加到Core Data定义的实体中?

2 个答案:

答案 0 :(得分:2)

是的,无论如何你必须拨打NSManagedObject / NSEntityDescription的指定初始化程序。

这样的事情:

class Foo: NSManagedObject {

    @NSManaged var title: String
    @NSManaged var subtitle: String?
    @NSManaged var id: Int32

    class func create(in context: NSManagedObjectContext, from json: [String: Any]) -> Foo {
        let foo = NSEntityDescription.insertNewObject(forEntityName: "Foo", into: context) as! Foo
        foo.title = json["title"] as! String
        foo.subtitle = json["subtitle"] as? String
        foo.id = json["id"] as! Int32
        return foo
    }
}

create(in是一种类方法,你可以称之为

let context = appDelegate.managedObjectContext
let newItem = Foo.create(in: context, from: jsonDictionary)

appDelegateAppDelegate个实例,jsonDictionary[String:Any]字典。

答案 1 :(得分:0)

只需使用方便的初始化程序扩展您的类:

convenience init(
  context moc: NSManagedObjectContext, 
  json: [String: Any]
) {
    self.init(context: moc)

    id = json["id"] as? Int
    title = json["title"] as? String
    subtitle = json["subtitle"] as? String
}