Как я могу обрабатывать различные типы данных JSON с помощью Codable? - PullRequest
0 голосов
/ 28 апреля 2020
struct Sample: Codable {
    let dataA: Info?

    enum CodingKeys: String, CodingKey {
        case dataA
    }

    enum Info: Codable {
        case double(Double)
        case string(String)

        init(from decoder: Decoder) throws {
            let container = try decoder.singleValueContainer()
            if let x = try? container.decode(Double.self) {
                self = .double(x)
                return
            }
            if let x = try? container.decode(String.self) {
                self = .string(x)
                return
            }
            throw DecodingError.typeMismatch(Info.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for Info"))
        }

        func encode(to encoder: Encoder) throws {
            var container = encoder.singleValueContainer()
            switch self {
            case .double(let x):
                try container.encode(x)
            case .string(let x):
                try container.encode(x)
            }
        }
    }
}

Итак, я получил некоторые данные с сервера как JSON и преобразовал их для моей модели "Образец".

Как видите, Sample.data может быть String или Double.

Но я не знаю, как я могу получить dataA в другом классе.

let foodRate = dataFromServer.dataA .....?

Что я должен сделать для использования dataA?

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете использовать оператор switch для извлечения значений

switch dataFromServer.dataA {
case .double(let number):
    print(number)
case .string(let string):
    print(string)
case .none:
    print("Empty")
}
...