Swift中带有可失败初始化的NSManagedObject子类

3

我有一个NSManagedObject子类,它需要在返回之前被填充(它所有的字段都是非可选的),所以当我进行初始化时,首先使用guard来确保数据(来自JSON)正确,如下所示:

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 ,因为这个初始化方法可能会在调用super.init之前抛出异常。

我的问题是如何继续进行: 1. 我应该在创建“虚拟对象”之前先调用super.init,然后再执行保护吗?在这种情况下,我应该在抛出异常之前将此对象从上下文中删除吗? 2. 在进行此保护之前,我可以进行另一个测试以确保entityName正确,如下所示:

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

在这种情况下,我无法在上下文中创建对象,因为我没有实体,因此在一个上下文中创建一个空实体对象是不可能的(我认为)。
您有任何关于如何继续的建议吗?
谢谢!
1个回答

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
}

然而,在我看来,如果找不到核心数据实体,抛出错误并没有太多意义。那将是一个编程错误,没有明智的方法在运行时捕获和解决该问题。我会将其视为致命错误,以便在测试应用程序时尽早检测出来:

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

谢谢@Martin R,那很有道理! :) - Jorge Maroto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接