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)
}
}
鉴于此 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)
}
}