ios - 编码协议(protocol)变量

标签 ios swift codable swift-protocols

假设我有这个提供变量的协议(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/

相关文章:

json - 如何在 Swift 中表示通用的 JSON 结构?

ios - Swift `Decodable` 不适用于嵌套的 JSON 对象,除非嵌套是一个数组

javascript - 在 cordova 应用程序中找不到插件

ios - PWA 上 iPhone X 上的白色状态栏

ios - Swift - 如何获取 iPhone 上所有照片和视频的列表?

swift - 无法在 Swift 中通过 MapKit 绘制折线

ios - swift : Play Video in Landscape Mode When Fullscreen

iphone - NSSet如何随机提取对象?

ios - swift 2 : AVAssetReader and NSInputStream Audio Graph

json - Swift,当 key 未知/动态时,如何使用 Decodable 和 Codable 解析/解码 JSON