Получение ошибок при создании подклассов JSON (Swift) - PullRequest
0 голосов
/ 15 марта 2019

Я довольно новичок в работе с данными JSON в Swift и пытаюсь разделить некоторые продукты на подклассы. Я не хочу кодировать дамп, но я хочу дать вам полную картину. У меня есть три ошибки, которые говорят об одном и том же: Выданные отсюда ошибки не обрабатываются Они встречаются в 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

1 Ответ

1 голос
/ 15 марта 2019

«Ошибки выброшены», возможно, могут быть подсказкой, как это исправить. Добавьте 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.

...