首页 > 解决方案 > Swift:任何数组不符合协议“可解码”

问题描述

我正在解码一个 json 响应,但我得到了不同对象的数组。这是我的实现:

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

这是我的错误:

在此处输入图像描述

我对你们中的任何人的问题是,我怎样才能使这个实现符合协议Decodable

我会非常感谢你的帮助

标签: iosswiftcodabledecodablejsondecoder

解决方案


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
}

默认情况下,对于简单类型或其他 Decodable 实现的类型,可以省略初始化程序,因为 Swift 可以自动将您的 JSON 对象映射到您的 Swift 对象。

在您的情况下,该Any类型不是 Decodable :

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

因此,您应该使用特定的泛型类型键入您的数组(这是更好的解决方案),或者在解码初始化程序中编写特定的解码过程:

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


推荐阅读