如何在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 }