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")
}
我有一个 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")
}