Как я могу использовать [String: Any]? как свойство в Struct, которое соответствует Codable - PullRequest
1 голос
/ 19 апреля 2019

У меня есть структура, которая соответствует протоколу Codable. У меня есть свойство типа [String: Any] ?. Но кодируемый не позволяет мне его использовать. Сказать ошибку

does not conform to protocol 'Decodable

1 Ответ

0 голосов
/ 19 апреля 2019

Используйте старый класс JSONSerialization для преобразования между Data и [String: Any], если необходимо.Data является кодируемым.Вы также можете использовать другой формат, например String.Обратите внимание, что swift строго типизирован, поэтому использование enum со связанными значениями обычно предпочтительнее, чем Any.Если целью является на самом деле запись всего сервера, а не в локальное хранилище, вы также можете просто забыть о Codable и полностью использовать JSONSerialization.

Пример:

import UIKit
import PlaygroundSupport

struct A: Codable {
    let a: Int
    let b: [String: Any]

    enum CodingKeys: String, CodingKey {
        case a
        case b
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        a = try values.decode(Int.self, forKey: .a)
        let data = try values.decode(Data.self, forKey: .b)
        b = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(a, forKey: .a)
        let data = try JSONSerialization.data(withJSONObject: b, options: [])
        try container.encode(data, forKey: .b)
    }
}
...