swift 中具有可失败初始化的 NSManagedObject 子类

NSManagedObject subclass with failable init in swift

我有一个 NSManagedObject 子类,需要在 return 之前正确完成(它的所有字段都是非可选字段),所以当我执行初始化时,首先我使用确保数据(来自 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
    }
...
...

问题是编译器 return 给我一个错误 Super.init isn't called before returning from initializer 因为这个 init 方法有可能在没有调用 super.init 之前抛出异常。

我哥们是关于如何进行的: 1. 我应该先调用 super.init 并在 guard 之前创建一个 "dummy object" 吗?在这种情况下,我应该在抛出异常之前从上下文中删除这个对象吗? 2. 我之前可以对这个守卫做的另一个测试是确保 entityName 是正确的,如下所示:

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

在这种情况下,我无法在上下文中创建对象,因为我没有实体,所以(我认为)不可能在一个上下文中创建一个无实体对象。

关于我如何继续的任何建议?

谢谢!

"Super.init isn't called before returning from initializer"问题 可以通过实现 convenience 初始化器来解决 专用初始化器的:

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
}

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

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