¿Cómo hacer un inicializador designado para la subclass NSManagedObject en 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 } 

Quiero hacer un método que me permita inicializar nuevos objects con esta llamada:

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

Pero me sale el error:

 Convenience initializer for Alternative must delegate with self.init 

¿Qué necesito cambiar en mi initalizador para que mi uso de ejemplo funcione?

Un iniciador de conveniencia debe llamar al inicializador designado en self :

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

que se llamaría como

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

Además, también podría mover la creación de la descripción de entidad en el inicializador de conveniencia en lugar de pasarla como argumento (como motivado por la respuesta de 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 } 

Simplemente hice esto con una function de class:

 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 } 

que puedes llamar así (casi tan bonito):

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

Tiene que llamar a un inicializador designado desde su inicializador de conveniencia. Además, no devuelve nada de ningún inicializador.

Para cumplir con las reglas, que se describen en la documentation de Swift de Apple, primero necesita un inicializador designado para su subclass, que llama a init () de su superclass, entonces puede ofrecer un inicializador de conveniencia que solo puede llamar a un inicializador designado desde su statement de class

Esto funcionaría: ( Actualizado: Teniendo en count que las properties de datos centrales marcadas con @NSManaged se inicializan automáticamente por el time de ejecución. Gracias @ 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) } 

Solución Swift 3.1 :

 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 }