Эта ошибка компилятора не связана с Core Data.Это вызвано двумя 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
}