CoreData和Codable类编译器错误:从初始化程序返回之前,未在所有路径上调用'self.init'

时间:2019-02-28 22:41:17

标签: swift core-data swift4 codable

按照此答案中的说明进行操作后:https://stackoverflow.com/a/46917019/6047611

我遇到编译器错误const number_game = (x, y) => { let numArray = []; if (x > y) { for (i = y + 1; i < x; i++) { if (i % 2 === 0) { numArray.push(i); } } } else if (x < y) { for (i = x + 1; i < y; i++) { if (i % 2 !== 0) { numArray.push(i); } } } return numArray; }; console.log(number_game(12, 0)); console.log(number_game(0, 12)); 'self.init' isn't called on all paths before returning from initializer.。但是,调用super.init()然后初始化类中的所有属性都无法完全初始化该类。

我迷路了。我对CoreData刚起步,还不太满意,所以我希望这是我自己的无知问题。关于如何解决此错误的任何想法?

self.init(entity: entity, insertInto: context)

1 个答案:

答案 0 :(得分:0)

此编译器错误与核心数据无关。它是由两个guard语句引起的,这两个语句可以在调用return之前self.init

在下面的语句中,如果context为nil,则else条件将显示“失败的上下文获取”,然后显示return

guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext 
else { print("failed context get"); return }

您正试图在调用self.init之前返回。这是不允许的。您的便利初始化程序必须返回正确初始化的对象。

但是,如果有一个guard语句不能满足的情况,您有一个出路:您可以throw例外。然后,调用方有责任以任何合理的方式处理异常。

为此,您需要创建一个符合enum协议的Error,例如:

enum ProductError: Error {
    case contextMissing
    case entityCreationFailed
}

然后您可以像这样重写guard语句:

guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext 
else { print("failed context get"); throw ProductError.contextMissing }

创建Product时,您可以执行以下操作:

let product = try? Product(from: decoder)  
//product is an optional, might be nil

或者这个:

if let product = try? Product(from: decoder) {
    //product is not an optional, cannot be nil
}