Есть ли способ переопределить реализацию Decodable для определенного типа, чтобы он использовал, что тип является частью Codable
struct?
В частности, у меня есть эта структура:
struct Activity: Codable {
let id: Int
let name: String
<...>
let distance: Measurement<UnitLength>
}
Я бы хотел предоставить инициализатор декодирования, например:
extension Measurement where UnitType == UnitLength {
public init(from decoder: Decoder) throws {
self = Measurement(value: try decoder.singleValueContainer().decode(Double.self), unit: UnitLength.meters)
}
}
Так что я могу преобразовать Double
значение в Measurement<UnitLength>
при декодировании, без необходимости предоставлять пользовательский init(from decoder: Decoder)
для каждого struct
, в котором есть Measurement
.
То, что init
компилируется нормально, но, похоже, не вызывается из стандартного процесса декодирования Codable
.
Моя временная реализация - это init для структуры Activity
:
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
<...>
distance = Measurement(value: try values.decode(Double.self, forKey: .distance), unit: UnitLength.meters)
}
Но я бы предпочел реализовать его один раз на Measurement
, чем для каждого типа, который может его использовать.