可编码类的继承

Ale*_*lex 11 inheritance swift4 codable decodable encodable

我正在使用Swift 4和Xcode 9.2编写程序.我在编写可编码类(完全是类,而不是struct)时遇到了困难.当我尝试从另一个类继承一个类时,JSONEncoder不从子类(子)获取所有属性.请看这个:

class BasicData: Encodable {

    let a: String
    let b: String

    init() {
        a = "a"
        b = "b"
    }
}

class AdditionalData: BasicData {

    let c: String

    init(c: String) {
        self.c = c
    }

}

let encode = AdditionalData(c: "c")

do {
    let data = try JSONEncoder().encode(encode)
    let string = String(data: data, encoding: .utf8)
    if let string = string {
        print(string)
    }
} catch {
}
Run Code Online (Sandbox Code Playgroud)

它会打印出来: {"a":"a","b":"b"}

但我需要这个: {"a":"a","b":"b","c":"c"}

它看起来像c类的属性AdditionalData只是失去了某处,不知何故.

所以问题是:如果我有使用协议编码的类Encodable如何正确地创建子类(此类的子类,继承)类?

我会感谢任何帮助或建议.

Cod*_*ent 16

EncodableDecodable涉及一些代码综合,其中编译器基本上为您编写代码.符合BasicDataEncodable,这些方法将写入BasicData类,因此它们不知道子类定义的任何其他属性.您必须覆盖encode(to:)子类中的方法:

class AdditionalData: BasicData {
    let c: String
    let d: Int

    init(c: String, d: Int) {
        self.c = c
        self.d = d
    }

    private enum CodingKeys: String, CodingKey {
        case c, d
    }

    override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.c, forKey: .c)
        try container.encode(self.d, forKey: .d)
    }
}
Run Code Online (Sandbox Code Playgroud)

有关类似问题,请参阅此问题Decodable.