【问题标题】:Getting Errors when Subclassing JSON (Swift)子类化 JSON (Swift) 时出错
【发布时间】:2019-03-15 18:07:52
【问题描述】:

我对在 Swift 中处理 JSON 数据还很陌生,我正在尝试对一些产品进行子类化。我不是要编码转储,但我想给你整个画面。我有三个相同的错误:从这里抛出的错误没有得到处理它们发生在required init。提前致谢。代码如下:

import UIKit

class Product: Decodable {
    var category: String = ""
    var material: String = ""

    init() {

    }
}

class TelephoneWithCord: Product {

    var sku: Double
    var isNew: Bool

    private enum CodingKeys: String, CodingKey {
        case sku = "sku"
        case isNew = "isNew"
    }

    required init(from decoder: Decoder) {

        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.sku = try container.decode(Double.self, forKey: .sku)
        self.isNew = try container.decode(Bool.self, forKey: .isNew)
    }
}

let json = """

{
    "category" : "home",
    "material" : "plastic",
    "sku" : 264221,
    "isNew" : true
}

""".data(using: .utf8)!

let telephoneWithCord = try! JSONDecoder().decode(TelephoneWithCord.self, from: json)

telephoneWithCord.category
telephoneWithCord.material
telephoneWithCord.sku
telephoneWithCord.isNew

【问题讨论】:

  • 应该是required init(from decoder: Decoder) throws {

标签: json swift subclassing jsondecoder


【解决方案1】:

“抛出的错误”可能是有关如何解决此问题的提示。将throws 添加到required init。另外,不要忘记调用super 以正确初始化您的代码,否则您将收到另一个错误。试试这些改变...

required init(from decoder: Decoder) throws {  // add throws to eliminate errors

    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.sku = try container.decode(Double.self, forKey: .sku)
    self.isNew = try container.decode(Bool.self, forKey: .isNew)
    try super.init(from: decoder)  // calling super for proper intialization of code
}

附带说明:如果您的 sku 中没有使用任何小数点,那么您应该将类​​型更改为 Int 而不是 Double

【讨论】:

  • y̶o̶u̶̶s̶h̶o̶u̶l̶d̶̶c̶h̶a̶n̶g̶e̶̶t̶h̶e̶̶t̶y̶p̶e̶̶t̶o̶̶I̶n̶t̶̶i̶n̶s̶t̶e̶a̶d̶̶o̶f̶̶D̶o̶u̶b̶l̶e̶你根本不应该使用数字类型。这不是一个数字,而是一系列数字。
  • @Caswell 您是否建议将其表示为String
  • 我认为它可能在后端表示为Int,所以我会更愿意保持这种方式。我可能是错的。 JohnW 肯定知道,他应该相应地调整他的代码。
  • 另外,如果有一些 sku 确实有小数,那么将它们全部保留为 Doubles 可能更明智。这些是 JohnW 需要确定的事情。
  • 那么后端也需要修复。我相信每个人都会喜欢花时间解决这个问题:gist.github.com/woolsweater/f7c1ca8f0f1c3ea1152e38acc135c6f0
猜你喜欢
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多