如何在Swift中为NSManagedObject子类创建指定的初始值设定项?

bog*_*gen 30 core-data nsmanagedobject ios swift

class Alternative: NSManagedObject {

    @NSManaged var text: String
    @NSManaged var isCorrect: Bool
    @NSManaged var image: NSData
} 

convenience init(text: String, isCorrect: Bool, entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext!) {
        let alternative = Alternative(entity: entity, insertIntoManagedObjectContext: context) as Alternative
        alternative.text = text
        alternative.isCorrect = isCorrect
        return alternative
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个方法,让我用这个调用初始化新对象:

let newAlternative = Alternative("third platform", True, entityDescription, managedObjectContext)
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

Convenience initializer for Alternative must delegate with self.init
Run Code Online (Sandbox Code Playgroud)

我需要更改我的initalizer以使我的示例使用工作?

Mar*_*n R 36

便捷初始化程序必须调用指定的初始化程序self:

convenience init(text: String, isCorrect: Bool, entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext!) {
    self.init(entity: entity, insertIntoManagedObjectContext: context)
    self.text = text
    self.isCorrect = isCorrect
}
Run Code Online (Sandbox Code Playgroud)

这将被称为

let newAlternative = Alternative(text: "third platform", isCorrect: true,
     entity: entityDescription, insertIntoManagedObjectContext: managedObjectContext)
Run Code Online (Sandbox Code Playgroud)

此外,您还可以将实体描述的创建移动到便利初始化器中,而不是将其作为参数传递(由Mundi的答案推动):

convenience init(text: String, isCorrect: Bool, insertIntoManagedObjectContext context: NSManagedObjectContext!) {
    let entity = NSEntityDescription.entityForName("Alternative", inManagedObjectContext: context)!
    self.init(entity: entity, insertIntoManagedObjectContext: context)
    self.text = text
    self.isCorrect = isCorrect
}
Run Code Online (Sandbox Code Playgroud)


Mun*_*ndi 10

我只是用类函数做了这个:

class func newInstance(text: String, notes:String, 
                    context: NSManagedObjectContext) -> Item {
    var item = NSEntityDescription.insertNewObjectForEntityForName("Item", 
               inManagedObjectContext: context) as Item
    item.notes = notes
    item.text = text
    return item
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样打电话(几乎一样漂亮):

let item = Item.newInstance(text, notes:notes, context:context)
Run Code Online (Sandbox Code Playgroud)

  • +1表示*不*需要将实体描述传递给初始化程序. (2认同)