相关疑难解决方法(0)

可编码类的继承

我正在使用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如何正确地创建子类(此类的子类,继承)类?

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

inheritance swift4 codable decodable encodable

11
推荐指数
1
解决办法
1599
查看次数

在继承中使用Decodable会引发异常

我正在使用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 decodable

5
推荐指数
1
解决办法
1637
查看次数

在Swift中默认使类符合Codable

Swift as CodableDecodableEncodable)协议的这种功能非常有用。但我发现了这样的问题:让我们让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)

inheritance json swift codable

1
推荐指数
1
解决办法
2223
查看次数

标签 统计

codable ×2

decodable ×2

inheritance ×2

swift ×2

encodable ×1

json ×1

swift4 ×1