Arrays 如何使用Swift Decodable自定义解码数组的每个元素

Arrays 如何使用Swift Decodable自定义解码数组的每个元素,arrays,swift,decodable,Arrays,Swift,Decodable,我正在解码一个weather JSON响应,我想将信息传递给一个子解码器,该子解码器将解码一个数组。在使用Swift Decodable进行解码时,如何为每个JSON数组元素传递此信息 我正在尝试在最新的Swift版本4.2中执行上述操作,并且我已经实现了必要的代码,以成功自定义解码阵列中使用的相同模型。我无法解码整个阵列 struct DataBlock: Decodable { /.. let weather: [DataPoint]? init(from deco

我正在解码一个weather JSON响应,我想将信息传递给一个子解码器,该子解码器将解码一个数组。在使用Swift Decodable进行解码时,如何为每个JSON数组元素传递此信息

我正在尝试在最新的Swift版本4.2中执行上述操作,并且我已经实现了必要的代码,以成功自定义解码阵列中使用的相同模型。我无法解码整个阵列

struct DataBlock: Decodable {
    /..
    let weather: [DataPoint]?

    init(from decoder: Decoder) throws {
        try self.init(from: decoder, units: .unit)
    }

    init(from decoder: Decoder, units: Units) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        /..
        let nestedDecoder = try values.superDecoder(forKey: .weather)
        self.weather = try [DataPoint(from: nestedDecoder, units: units)]
    }

    enum CodingKeys: String, CodingKey {
        /..
        case weather
    }
}
在数据点模型中:

init(from decoder: Decoder, units: Units) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    /...
    if let value = try values.decodeIfPresent(Double.self, forKey: .value) {
        self.value = Example(value: value, units: units)
    } else {
        self.value = nil
    }
    /..
}
我试图解码的JSON结构的相关部分:

"datablock": {
    "weather": [
        {
            /..
            "value": 22.72
            /..
        }
    ]
}
我希望解码器能通过

units
并手动解码每个数组元素

但是,我得到一个调试错误:

"Expected to decode Dictionary<String, Any> but found an array instead."

这解决了我的问题,让我“演练”每个JSON数组元素并分别解码:

struct DataBlock: Decodable {
    /..    
    init(from decoder: Decoder, units: Units) throws {
        /..
        var data = [DataPoint]()
        var dataContainer = try values.nestedUnkeyedContainer(forKey: .data)

        while !dataContainer.isAtEnd {
            let nestedDecoder = try dataContainer.superDecoder()
            let dataPoint = try DataPoint(from: nestedDecoder, units: units)
            data.append(dataPoint)
        }

        self.data = data
        /..
    }
    /..
}

你能展示一下你要解码的JSON吗?哎呀,我刚刚添加了JSON部分!抛出的错误在哪里?您可以发布用于获取JSON响应的url吗?或者指向接收到json数据的文件的链接?澄清了引发错误的行
struct DataBlock: Decodable {
    /..    
    init(from decoder: Decoder, units: Units) throws {
        /..
        var data = [DataPoint]()
        var dataContainer = try values.nestedUnkeyedContainer(forKey: .data)

        while !dataContainer.isAtEnd {
            let nestedDecoder = try dataContainer.superDecoder()
            let dataPoint = try DataPoint(from: nestedDecoder, units: units)
            data.append(dataPoint)
        }

        self.data = data
        /..
    }
    /..
}