我有一个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对象上下文。
有关如何进行的任何建议?
谢谢!
答案 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")
}