我正在使用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如何正确地创建子类(此类的子类,继承)类?
我会感谢任何帮助或建议.
我正在使用Rest API服务,在该服务中,响应分为基本响应,所有其他响应都从该继承。
我正在尝试使用Decoder接口为响应模型类构建相同的结构。
但是我在解码继承的类时遇到问题。
我试图解决此问题: 在带有继承的Swift 4中使用Decodable
但是没有运气。
这是初始结构:
class LoginResponse: BaseResponse{
var Message: String?
private enum CodingKeys: String, CodingKey{
case Message
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
Message = try container.decode(String.self, forKey: .Message)
let superDecoder = try container.superDecoder()
try super.init(from: superDecoder)
}
}
class BaseResponse: Decodable {
var Status: Int?
private enum CodingKeys: String, CodingKey{
case Status
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self) // This …
Run Code Online (Sandbox Code Playgroud) Swift as Codable
(Decodable
&Encodable
)协议的这种功能非常有用。但我发现了这样的问题:让我们让Parent类符合Codable
:
class Parent: Codable {
var name: String
var email: String?
var password: String?
}
Run Code Online (Sandbox Code Playgroud)
好的,该类符合“从盒子开始”的Codable协议,您无需编写任何初始化程序,就可以像这样从JSON进行初始化:
{ "name": "John", "email": "johndoe@yahoo.com", "password": <null>}
Run Code Online (Sandbox Code Playgroud)
但假设我们需要其他类,Child从Parent继承并符合Codable:
class Child: Parent {
var token: String
var date: Date?
}
Run Code Online (Sandbox Code Playgroud)
因此,Child类必须通过与Parent保持一致,从而与Codable保持一致,Child类的BUT属性将无法从JSON正确初始化。我发现的决定是自己为Child类编写所有可编码内容,例如:
class Child: Parent {
var token: String
var date : Date?
enum ChildKeys: CodingKey {
case token, date
}
required init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: ChildKeys.self)
self.token …
Run Code Online (Sandbox Code Playgroud)