gpt4 book ai didi

ios - NSManagedObject 子类在 swift 中具有可失败的初始化

转载 作者:搜寻专家 更新时间:2023-10-31 22:14:06 25 4
gpt4 key购买 nike

我有一个 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 return from initializer 因为这个 init 方法可能抛出异常而不调用 super.init 之前。

我的家伙是关于如何进行的:1. 我应该先调用 super.init 并在 guard 之前创建一个“虚拟对象”吗?在这种情况下,我应该在抛出异常之前从上下文中删除这个对象吗?2. 我之前可以对这个守卫做的另一个测试是确保 entityName 是正确的,如下所示:

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

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

关于我如何继续的任何建议?

谢谢!

最佳答案

“从初始化器返回前不调用 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
}

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

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

关于ios - NSManagedObject 子类在 swift 中具有可失败的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35500278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com