2016-02-19 2 views
3

У меня есть подкласс NSManagedObject, который необходимо выполнить перед тем, как правильно возвращаться (он имеет все свои поля как необязательные), поэтому, когда я выполняю init, в первую очередь использую охранником, чтобы быть уверенным в данных (от JSON) правильно следующим образом:Подкласс подкатегория NSManagedObject с отказоустойчивым инициализацией в 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 
    } 
... 
... 

проблема заключается в том, что компилятор возвращает мне ошибку Super.init isn't called before returning from initializer, потому что это возможно, что этот метод инициализации выдает исключение без раньше позвонить super.init.

Мой чувак о том, как действовать: 1. Должен ли я вызвать super.init раньше и создать «фиктивный объект» раньше, чем охранник? В этом случае я должен удалить этот объект из контекста, прежде чем выбрасывать исключение? 2. Еще один тест, который я мог бы сделать, прежде чем этот охранник должен быть уверен, что EntityName правильно следующим образом:

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

В этом случае я не могу создать объект в контексте, потому что я не» t есть сущность, поэтому невозможно (я думаю) создать объект nil-entity в одном контексте.

Любое предложение о том, как я могу продолжить?

Спасибо!

ответ

5

«Super.init не вызывается перед возвращением из инициализаторе» проблемы может быть решена путем внедрения удобство инициализатору вместо выделенного инициализаторе:

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 
} 

Однако, на мой взгляд, не имеет смысла бросать ошибку , если объект Core Data не найден. Это будет программирование ошибка и нет разумного способа поймать и решить эту проблему во время выполнения. Я бы относиться, что как фатальная ошибка, так что он обнаружен на ранней стадии во время тестирования приложения:

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

Спасибо @Martin R, который имеет смысл! :) –

+0

@JorgeMaroto: Добро пожаловать! –

Смежные вопросы