- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
按照此答案的说明进行操作后:https://stackoverflow.com/a/46917019/6047611
我遇到编译器错误 'self.init' isn't called on all paths before returning from initializer.
super.init()
是不允许的。但是,调用self.init(entity: entity, insertInto: context)
然后初始化类中的所有属性以某种方式不会完全初始化类。
我迷路了。我对 CoreData 还很陌生,而且还不太适应,所以我希望这是我自己无知的问题。关于如何修复此错误有什么想法吗?
import Foundation
import CoreData
class Product: NSManagedObject, Encodable, Decodable
{
@NSManaged var mongoID:[String:String]
@NSManaged var title:String
@NSManaged var productID:Int
@NSManaged var mpn:String
@NSManaged var listPrice:Float
@NSManaged var price:Float
@NSManaged var uom:String
@NSManaged var uomQty:Int
@NSManaged var inventory:Float
@NSManaged var minSaleQty:Int
@NSManaged var desc:String
@NSManaged var categories:[String]
@NSManaged var imageURL:String
@NSManaged var upc:String
@NSManaged var quantity:Int
@NSManaged var disc:Bool
enum CodingKeys: String, CodingKey {
case mongoID = "mongoID"
case title = "title"
case productID = "productID"
case mpn = "mpn"
case listPrice = "listPrice"
case price = "price"
case uom = "uom"
case uomQty = "uomQty"
case inventory = "inventory"
case minSaleQty = "minSaleQty"
case desc = "desc"
case categories = "categories"
case imageURL = "imageURL"
case upc = "upc"
case quantity = "quantity"
case disc = "disc"
}
required convenience init(from decoder:Decoder) throws
{
guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext else { print("failed context get"); return }
guard let entity = NSEntityDescription.entity(forEntityName: "Product", in: context) else { print("failed entity init"); return }
self.init(entity: entity, insertInto: context)
let container = try decoder.container(keyedBy: CodingKeys.self)
self.mongoID = try container.decodeIfPresent([String:String].self, forKey: .mongoID) ?? ["$id":"nil"]
self.title = try container.decodeIfPresent(String.self, forKey: .title) ?? ""
self.productID = try container.decodeIfPresent(Int.self, forKey: .productID) ?? 0
self.mpn = try container.decodeIfPresent(String.self, forKey: .mpn) ?? ""
self.listPrice = try container.decodeIfPresent(Float.self, forKey: .listPrice) ?? 0.0
self.price = try container.decodeIfPresent(Float.self, forKey: .price) ?? 0.0
self.uom = try container.decodeIfPresent(String.self, forKey: .uom) ?? ""
self.uomQty = try container.decodeIfPresent(Int.self, forKey: .uomQty) ?? 0
self.inventory = try container.decodeIfPresent(Float.self, forKey: .inventory) ?? 0.0
self.minSaleQty = try container.decodeIfPresent(Int.self, forKey: .minSaleQty) ?? 0
self.desc = try container.decodeIfPresent(String.self, forKey: .desc) ?? ""
self.categories = try container.decodeIfPresent([String].self, forKey: .categories) ?? [""]
self.imageURL = try container.decodeIfPresent(String.self, forKey: .imageURL) ?? ""
self.upc = try container.decodeIfPresent(String.self, forKey: .upc) ?? ""
self.quantity = try container.decodeIfPresent(Int.self, forKey: .quantity) ?? 0
self.disc = try container.decodeIfPresent(Bool.self, forKey: .disc) ?? false
}//'self.init' isn't called on all paths before returning from initializer
public func encode(to encoder: Encoder) throws
{
}
}
extension CodingUserInfoKey {
static let context = CodingUserInfoKey(rawValue: "context")
}
最佳答案
此编译器错误与 Core Data 无关。这是由两个 guard
语句引起的,这两个语句可以在调用 self.init
之前返回
。
在下面的语句中,如果context
为nil,则else
条件将打印“failed context get”,然后返回
:
guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext
else { print("failed context get"); return }
您试图在调用 self.init
之前返回。这是不允许的。您的便利初始化程序必须返回一个正确初始化的对象。
但是,如果任何一个 guard
语句无法满足,您有一个出路:您可以抛出
异常。然后,调用者有责任以任何有意义的方式处理异常。
为此,您需要创建一个符合 Error
协议(protocol)的 enum
,例如:
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 }
创建产品
时,您可以执行以下操作:
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
}
关于swift - CoreData 和 Codable 类编译器错误 : 'self.init' isn't called on all paths before returning from initializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935422/
给定这个类: class MyClass: Codable { var variable : Codable? = nil } 我得到错误: Type 'MyClass' does not c
鉴于 Array 符合 Codable 我假设 Codable 的数组,即 [Codable] 应该肯定可转换为 Codable。 我已经用 Decodable 部分做了一个简单的例子。并且只是为了验
我希望创建一个类来存储 Date 和任何符合 Codable 协议(protocol)的对象。我希望此类也符合 Codable 协议(protocol)本身。 我可以按如下方式为一个对象执行此操作:
ClassA 符合 Cadable 并具有一系列属性。其中之一是不符合 Codable 的已经存在的非常复杂的 ClassB 的属性。我可以手动解码 Codable 类的非 Codable 属性吗?
当遵循 Codable 协议(protocol)时,我不能轻易跳过非 Codable 类的可选属性 在 Ride 结构中,我们希望跳过 driver 属性的编码 和解码,并保留它 nil 解码时:
假设我有一些 JSON,如下所示: { "some-random-key": { "timestamp": 1234123423
很多人告诉我,codable 比使用 swiftyjson 好得多,所以我正在尝试一下。我想将此 JSON 的返回值 https://api.gdax.com/products/BTC-USD/boo
我有一个 Codable 类型,比方说 Car ,它被定义为: struct Car: Codable { let age: Int let color: String } 我可以很好
我正在尝试实现类似于 Swift 如何在实现 Codable 的类中定义的枚举上使用 CodableKeys 协议(protocol)集的方式。在我的例子中,类是 CommandHandler,枚举是
我正在尝试将“Object Mapper”转换为“Codable”。我来自服务的响应包括 NSArray,其中包含自定义对象。我需要在 Codable 类中使用 NSArray 和 NSDiction
使用 Codable,我可以创建以下扩展 extension Decodable { public static func decode(data: Data, decoder: JSONDe
我有一个 API,它以前缀表示法接收查询。例如(+ 1 2)这可以递归地完成,例如(+ 1 (- 1 2)) 准确地说,所需的 json 如下所示: { "query":[ {
struct Data: Codable { let name: String? let dataArray: [User] = [User]() } dataArray 是可选的,所以我想用
这个问题在这里已经有了答案: check the json response is array or int or string for a key? (7 个答案) 关闭 3 年前。
我正在使用通用编码器来传递网络响应。我创建了以下函数来解码数据并返回结果: 这是该函数的一部分: guard let jsonDataUnwrapped = jsonData,
我有一个问题,我想我已经掌握了每个问题的基础知识,但不太确定如何将它们结合起来。 在 View Controller 中我有一个基本的 var 设置: var shipments = [Shipmen
我有一个(恼人的)情况,我的后端返回一个像这样的对象: { "user": { "name": [ "John" ], "fam
这个问题在这里已经有了答案: Swift 4 JSON Decodable with multidimensional and multitype array (5 个答案) 关闭 5 年前。 AP
我的 JSON 响应如下: { "data": [ { "unknown-key-c3e7f0": { "date_ti
我正在尝试为一个对象采用 Codable 协议(protocol),该对象必须从我的 Web 服务返回的 JSON 实例化以响应其中一个 API 调用。 其中一个属性是enumeration类型,可选
我是一名优秀的程序员,十分优秀!