NSManagedObject子类,在swift中使用可用的init

时间:2016-02-19 08:04:30

标签: ios swift core-data nsmanagedobject

我有一个NSManagedObject子类,需要在正确返回之前完成(它的所有字段都是非选项),所以当我执行init时,首先我使用一个后卫来确保数据(来自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 isn't called before returning from initializer,因为此init方法可能抛出异常而不调用super.init

我的家伙是关于如何继续: 1.我以前应该打电话给super.init并创建一个"虚拟对象"在守卫之前?在这种情况下,我应该从上下文中删除此对象之前抛出异常? 2.在此警卫之前我可以做的另一项测试是确保entityName正确如下:

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

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

有关如何进行的任何建议?

谢谢!

1 个答案:

答案 0 :(得分: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")
    }