2016-02-19 1 views
3

J'ai une sous-classe NSManagedObject, qui doit être remplie avant de retourner correctement (elle a tous ses champs comme non-optionnels), donc quand je fais l'init, tout d'abord j'utilise un garde pour être sûr des données (de JSON) est correct comme suit:Sous-classe NSManagedObject avec init de fift dans swift

public init(context: NSManagedObjectContext, dictionary: [String: AnyObject]) throws { 
    guard 
    let modified_on = date(dictionary["modified_on"] as? String), 
    let start_on = date(dictionary["start_on"] as? String), 
    let end_on = date(dictionary["end_on"] as? String), 
    let ticket_name = dictionary["ticket_name"] as? String 
    else { 
     throw ErrorParseModel.ErrorParsing 
    } 
... 
... 

Le problème est que le compilateur me renvoie une erreur Super.init isn't called before returning from initializer car il est possible que cette méthode init lance une exception sans appeler super.init avant.

Mon mec est sur la façon de procéder: 1. Devrais-je appeler super.init avant et créer un "objet fictif" avant que garde? Dans ce cas, je devrais enlever cet objet du contexte avant de jeter l'exception? 2. Un autre test que je pouvais faire avant de cette garde est d'être sûr que entityName est correct comme suit:

guard let entity = NSEntityDescription.entityForName(Ticket.entityName, inManagedObjectContext: context) else { 
    return 
} 

Dans ce cas, je ne peux pas créer l'objet dans le contexte parce que je n » J'ai une entité, donc il est impossible (je pense) de créer un objet à entité nulle dans un contexte.

Une suggestion sur comment procéder?

Merci!

Répondre

5

Le « super.init n'est pas appelé avant le retour de initialiseur » problème peut être résolu en mettant en place un pratique initialiseur au lieu d'initialisateur dédié:

public convenience init(context: NSManagedObjectContext, dictionary: [String: AnyObject]) throws { 
    guard let entity = NSEntityDescription.entityForName(Ticket.entityName, inManagedObjectContext: context) else { 
     throw ErrorParseModel.EntityNotFound 
    } 
    guard 
     let modified_on = date(dictionary["modified_on"] as? String) 
     // ... 
    else { 
     throw ErrorParseModel.ErrorParsing 
    } 
    self.init(entity: entity, insertIntoManagedObjectContext: context) 
    self.modified_on = modified_on 
} 

Cependant, à mon avis n'a pas beaucoup de sens à lancer une erreur si l'entité Données de base est introuvable. Ce serait une programmation erreur et il n'y a aucun moyen sensé d'attraper et de résoudre ce problème à l'exécution. Je traiterais que comme une erreur fatale, de sorte que il est détecté tôt lors du test de l'application:

guard let entity = NSEntityDescription.entityForName(Ticket.entityName, inManagedObjectContext: context) else { 
     fatalError("Entity not found") 
    } 
+0

Merci R @ Martin, qui fait sens! :) –

+0

@JorgeMaroto: Vous êtes les bienvenus! –