Swift: массив данных не соответствует протоколу Decodable - PullRequest
0 голосов
/ 29 марта 2020

Я декодирую ответ json, но получаю и массив различных объектов. Вот моя реализация:

public struct MyDecodable: Decodable {
    public var id: Int
    public var name: String
    public var someData: [Any]
}

Вот моя ошибка:

enter image description here

Мой вопрос к любому из вас: как можно Я заставляю эту реализацию соответствовать протоколу Decodable?

Буду очень признателен за вашу помощь

1 Ответ

1 голос
/ 29 марта 2020
Протокол

Decodable требует инициализатора с декодером, как сказано в документации:

/// A type that can decode itself from an external representation.
public protocol Decodable {
    /// Creates a new instance by decoding from the given decoder.
    ///
    /// This initializer throws an error if reading from the decoder fails, or
    /// if the data read is corrupted or otherwise invalid.
    ///
    /// - Parameter decoder: The decoder to read data from.
    init(from decoder: Decoder) throws
}

По умолчанию с простыми типами или другими реализуемыми декодируемыми типами инициализатор может быть опущен, поскольку Swift может автоматически отображать ваш JSON объект к вашему объекту Swift.

В вашем случае тип Any не может быть декодируемым:

Value of protocol type 'Any' cannot conform to 'Decodable', only struct/enum/class types can conform to protocols

Итак, вы должны ввести свой массив с указанием * 1019 Тип * generi c (это лучшее решение), либо либо запишите указанный процесс декодирования c в инициализаторе декодирования:

public struct MyDecodable: Decodable {
    public var id: Int
    public var name: String
    public var someData: [Any]

    enum CodingKeys: String, CodingKey {
        case id
        case name
        case someData
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
        // Do your stuff here to evaluate someData from your json
    }
}

Больше информации здесь (Swift4): https://medium.com/swiftly-swift/swift-4-decodable-beyond-the-basics-990cc48b7375

...