Encodable 的继承 Class
Inheritance of Encodable Class
我正在使用 Swift 4 和 Xcode 9.2 编写程序。我在编写 encodable class(确切地说 class,而不是结构)时遇到了困难。当我试图从另一个 class 继承一个 class 时,JSONEncoder 不会从子 class (子)中获取所有属性。请看这个:
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 {
}
它将打印:{"a":"a","b":"b"}
但我需要这个:{"a":"a","b":"b","c":"c"}
看起来 class AdditionalData
的 c
属性 只是不知何故不知何故丢失了。
所以问题是:如果我 class 使用协议 Encodable 签名,如何正确制作子 class(此 class 的子项,继承)class?
如有任何帮助或建议,我将不胜感激。
Encodable
和 Decodable
涉及一些代码合成,其中编译器基本上为您编写代码。当您使 BasicData
符合 Encodable
时,这些方法将写入 BasicData
class,因此它们不知道 subclasses 定义的任何其他属性.您必须在 subclass:
中覆盖 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)
}
}
有关 Decodable
的类似问题,请参阅 this question。
在我的例子中,基础 class 不需要真的是 Codable。只有 subclasses 需要是 Codable。在这种情况下,不要将基 class 声明为 Codable,而仅将子 class 声明为 Codable。通过这样做,您不需要执行任何 encode/codingKeys/init(from: Decoder) 样板文件。希望这对某些人有所帮助。
我正在使用 Swift 4 和 Xcode 9.2 编写程序。我在编写 encodable class(确切地说 class,而不是结构)时遇到了困难。当我试图从另一个 class 继承一个 class 时,JSONEncoder 不会从子 class (子)中获取所有属性。请看这个:
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 {
}
它将打印:{"a":"a","b":"b"}
但我需要这个:{"a":"a","b":"b","c":"c"}
看起来 class AdditionalData
的 c
属性 只是不知何故不知何故丢失了。
所以问题是:如果我 class 使用协议 Encodable 签名,如何正确制作子 class(此 class 的子项,继承)class?
如有任何帮助或建议,我将不胜感激。
Encodable
和 Decodable
涉及一些代码合成,其中编译器基本上为您编写代码。当您使 BasicData
符合 Encodable
时,这些方法将写入 BasicData
class,因此它们不知道 subclasses 定义的任何其他属性.您必须在 subclass:
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)
}
}
有关 Decodable
的类似问题,请参阅 this question。
在我的例子中,基础 class 不需要真的是 Codable。只有 subclasses 需要是 Codable。在这种情况下,不要将基 class 声明为 Codable,而仅将子 class 声明为 Codable。通过这样做,您不需要执行任何 encode/codingKeys/init(from: Decoder) 样板文件。希望这对某些人有所帮助。