Swift 4 JSON Декодируемый самый простой способ декодировать изменение типа

С протоколом Swift 4 Codable есть большой уровень недостижимости даты и стратегий преобразования данных.

Учитывая JSON:

{
    "name": "Bob",
    "age": 25,
    "tax_rate": "4.25"
}

Я хочу привести его в следующую структуру

struct ExampleJson: Decodable {
    var name: String
    var age: Int
    var taxRate: Float

    enum CodingKeys: String, CodingKey {
       case name, age 
       case taxRate = "tax_rate"
    }
}

Стратегия декодирования даты может преобразовывать основанную на строках дату в дату.

Есть ли что-то, что делает это с помощью Float на основе строк

В противном случае я застрял с использованием CodingKey для ввода строки и использования вычисления get:

    enum CodingKeys: String, CodingKey {
       case name, age 
       case sTaxRate = "tax_rate"
    }
    var sTaxRate: String
    var taxRate: Float { return Float(sTaxRate) ?? 0.0 }

Это В некотором роде я выполняю больше техобслуживания, чем кажется необходимым.

Это самый простой способ или есть что-то похожее на DateDecodingStrategy для других преобразований типов?

Обновление : я должен отметить: я также прошел путь переопределения

init(from decoder:Decoder)

Но это в противоположном направлении, так как это заставляет меня делать все это для себя.

24
задан pkamb 18 July 2019 в 00:16
поделиться

1 ответ

Я использовал версию Suran, но обновил ее для возвращения обязательного значения для декодирования (). Мне это - самая изящная версия. Быстро 5.2.

extension KeyedDecodingContainer {

func decodeIfPresent(_ type: Float.Type, forKey key: K, transformFrom: String.Type) throws -> Float? {
    guard let value = try decodeIfPresent(transformFrom, forKey: key) else {
        return nil
    }
    return Float(value)
}

func decode(_ type: Float.Type, forKey key: K, transformFrom: String.Type) throws -> Float {
    guard let str = try? decode(transformFrom, forKey: key),
        let value = Float(str) else {
            throw DecodingError.typeMismatch(Int.self, DecodingError.Context(codingPath: codingPath, debugDescription: "Decoding of \(type) from \(transformFrom) failed"))
    }
    return value
}
}
1
ответ дан 28 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: