按照此答案中的说明进行操作后: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)
答案 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
}