NSManagedObject 子类在 swift 中初始化失败

Posted

技术标签:

【中文标题】NSManagedObject 子类在 swift 中初始化失败【英文标题】:NSManagedObject subclass with failable init in swift 【发布时间】:2016-02-19 08:04:30 【问题描述】:

我有一个 NSManagedObject 子类,它需要在正确返回之前完成(它的所有字段都是非可选的),所以当我执行初始化时,首先我使用一个守卫来确保数据(来自 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,然后再创建一个“虚拟对象”而不是guard?在这种情况下,我应该在抛出异常之前从上下文中删除这个对象吗? 2.我之前可以对这个守卫做的另一个测试是确保 entityName 正确,如下所示:

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

“在从初始化程序返回之前未调用 Super.init”问题 可以通过实现 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

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

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

【讨论】:

感谢@Martin R,这很有道理! :)

以上是关于NSManagedObject 子类在 swift 中初始化失败的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 NSManagedObject 子类不能使用自定义访问器?

如何在 swift 中将子类 NSManagedObject 分配给 var(而不是常量)

CoreData 无法正确“创建 NSManagedObject 子类”Swift

是否不需要在 Swift 3 中继承 NSManagedObject ?

“filename+CoreDataProperties.swift”和“filename.swift”NSmanagedObject 子类有啥用?

将我的 NSManagedObject 子类与我的 ViewController.swift 连接起来