Codable Class 中的 Codable 变量

Codable variable in Codable Class

鉴于此 class:

class MyClass: Codable {
    var variable : Codable? = nil
}

我收到错误:

Type 'MyClass' does not conform to protocol 'Decodable'

Type 'MyClass' does not conform to protocol 'Encodable'

如何在 Codable class 中拥有一个符合 Codable 的通用变量作为 属性?

你不能。

但作为解决方法,您可以创建一个 enum 符合 Codable 的。

enum SubType: Codable {
    case foo
    case bar
}

如果我答对了你的问题可能是这样的

class MyClass<T: Codable>: Codable {
    var variable : T? = nil
}

如果你尝试实现你的解码器,你会得到类似的东西:

class MyClass: Codable {
    var variable: Codable?
    enum MyClassKeys: String, CodingKey {
        case variable = "variable"
    }
    required init(from decoder: Decoder) {
        let container = try! decoder.container(keyedBy: MyClassKeys.self)
        variable = try! container.decode(XXXX, forKey: .variable)
    }
}

但是您应该输入 class 类型而不是 XXXX(例如 String.self)。你能在这里放什么?编译器不可能猜出你想要什么。代替 Codable 类型,也许你可以放置一个符合 Codable 协议的 class。所以你可以有这样的东西:

class MyClass: Codable {
    var variable: MyClass?
    enum MyClassKeys: String, CodingKey {
        case variable = "variable"
    }
    required init(from decoder: Decoder) {
        let container = try! decoder.container(keyedBy: MyClassKeys.self)
        variable = try! container.decode(MyClass.self, forKey: .variable)
    }
}