Протокол
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