Вы должны декодировать значения как String
, а затем преобразовать их в Double
. Итак, либо приведите String
к Double
и укажите значение по умолчанию, например:
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.USD = Double(try container.decode(String.self, forKey: .USD)) ?? 0
self.EUR = Double(try container.decode(String.self, forKey: .EUR)) ?? 0
}
, либо сделайте свойства необязательными и удалите значения по умолчанию:
struct Prices: Codable {
var USD, EUR: Double?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.USD = Double(try container.decode(String.self, forKey: .USD))
self.EUR = Double(try container.decode(String.self, forKey: .EUR))
}
Примечание. : Кроме того, вам не требуется CodingKeys
, поскольку имена свойств такие же, как и ключи в данных.
В качестве альтернативы вы можете использовать метод computed property
, например:
struct Prices: Codable {
var USDString: String
var EURString: String
private enum CodingKeys: String, CodingKey {
case USDString = "USD"
case EURString = "EUR"
}
var USD: Double? { Double(USDString) }
var EUR: Double? { Double(EURString) }
}