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

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 } 

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

 let newAlternative = Alternative("third platform", True, entityDescription, managedObjectContext) 

但我得到的错误:

 Convenience initializer for Alternative must delegate with self.init 

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

便利初始值设定程序必须在self上调用指定的初始化程序:

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

这将被称为

 let newAlternative = Alternative(text: "third platform", isCorrect: true, entity: entityDescription, insertIntoManagedObjectContext: managedObjectContext) 

另外,还可以将实体描述的创build移动到便捷初始值设定项中,而不是将其作为parameter passing(如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 } 

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

 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 } 

你可以这样调用(几乎一样漂亮):

 let item = Item.newInstance(text, notes:notes) 

您必须从便捷初始值设定项中调用指定的初始值设定项。 另外,你不会从任何初始化器返回任何东西。

为了实现苹果Swift文档中描述的规则,首先需要为你的子类指定一个初始化器,它调用它的超类的init(),然后你可以提供一个便利的初始化器,它只允许从它的调用初始化器类声明。

这将工作:( 更新:考虑到标记为@NSManaged的核心数据属性由运行时自动初始化。谢谢@Martin R)

 init(text: String, isCorrect: Bool, image: NSData, entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext!) { super.init(entity: entity, insertIntoManagedObjectContext: context) } convenience init(text: String, isCorrect: Bool, entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext!) { self.init(text: text, isCorrect: isCorrect, entity: entity, insertIntoManagedObjectContext: context) } 

Swift 3.1解决scheme:

 convenience init(text: String, isCorrect: Bool, image: NSData, moc: NSManagedObjectContext) { let entity = NSEntityDescription.entity(forEntityName: "Alternative", in: moc) self.init(entity: entity!, insertInto: moc) // vars self.text = text self.isCorrect = isCorrect self.image = image }