Кодировать переменные протокола - PullRequest
0 голосов
/ 24 сентября 2019

предположим, у меня есть этот протокол, который предоставляет переменную

protocol Drivable { 
    func drive()
    var maximumSpeed: Double
}

extension Drivable {
   public var maximumSpeed: Double { return 50.5}
}

и конкретный кодируемый класс, который соответствует:

class Car: Drivable, Encodable {
    var manufacturer: String

    func drive() {
       print("Driving a car")
    } 
}

Попытка кодировать класс с помощью JSONEncoder().encode(myCar) приведет кв {"manufacturer:"Hyundai"} кодер не будет кодировать maximumSpeed, предоставляемый протоколом со значением по умолчанию, работает только тогда, когда я реализую кодирование и 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и кодировать каждый раз, когда класс соответствует Drivable Protocol.Как я могу предоставить стандартные CodingKeys и Encode для протокола переменных?

1 Ответ

0 голосов
/ 24 сентября 2019

JSONEncoder().encode() работает автоматически с сохраненными свойствами, а не с вычисленными, поэтому вам нужно добавить свойство maximumSpeed в вашу модель:

class Car: Drivable, Encodable {
    var manufacturer: String
    var maximumSpeed: Double

    func drive() {
       print("Driving a car")
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...