假设我有这个提供变量的协议(protocol)
protocol Drivable {
func drive()
var maximumSpeed: Double
}
extension Drivable {
public var maximumSpeed: Double { return 50.5}
}
以及一个符合以下条件的具体 Encodable 类:
class Car: Drivable, Encodable {
var manufacturer: String
func drive() {
print("Driving a car")
}
}
尝试使用 JSONEncoder().encode(myCar)
对类进行编码将导致 {"manufacturer:"Hyundai"}
,编码器不会对 maximumSpeed
由协议(protocol)提供默认值,仅当我实现编码和 CodingKeys 时才有效,例如:
class Car: Drivable, Encodable {
var manufacturer: String
func drive() {
print("Driving a car")
}
private enum CodingKeys : String, CodingKey {
case manufacturer
// Protocol Variable Here
case maximumSpeed
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(manufacturer, forKey: .manufacturer)
try container.encode(maximumSpeed, forKey: .maximumSpeed)
}
}
我觉得这不是一个很酷的方法来实现 CodingKeys 并在每次类符合 Driveable 协议(protocol)时进行编码。如何为变量协议(protocol)提供默认的 CodingKeys 和编码?
最佳答案
JSONEncoder().encode()
自动使用存储的属性,而不是计算的属性,因此您需要将 maximumSpeed
属性添加到模型中:
class Car: Drivable, Encodable {
var manufacturer: String
var maximumSpeed: Double
func drive() {
print("Driving a car")
}
}
关于ios - 编码协议(protocol)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58081048/