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 子类有啥用?