为什么我得到一个错误时解析响应在swift



我正在尝试调用API,我正在尝试将响应映射到模型类。但每次,我得到一个错误,无效的数据。

Api调用如下:

let endpoint = "http://apilayer.net/api/live?access_key=baab1114aeac6b4be74138cc3e6abe79&currencies=EUR,GBP,CAD,PLN,INR&source=USD&format=1"
guard let url = URL(string: endpoint) else {
completed(.failure(.invalidEndPoint))
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in

if let _ = error {
completed(.failure(.unableToComplete))
return
}
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
completed(.failure(.invalidResponse))
return
}
guard let data = data else {
completed(.failure(.invalidData))
return
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let convertedValues = try decoder.decode([Converted].self, from: data)
completed(.success(convertedValues))
} catch {
completed(.failure(.invalidData))
}
}

task.resume()
}

示例回复如下:

{
"success":true,
"terms":"https://currencylayer.com/terms",
"privacy":"https://currencylayer.com/privacy",
"timestamp":1610986207,
"source":"USD",
"quotes":{
"USDEUR":0.828185,
"USDGBP":0.736595,
"USDCAD":1.276345,
"USDPLN":3.75205
}
}

模型类

struct Converted: Codable {

let success: Bool
let terms, privacy: String?
let timestamp: Int?
let source: String?
let quotes: [String: Double]?
}

有人能帮我理解我错在哪里吗?提前谢谢。

错误消息有时会有所帮助。如果捕捉到错误并打印出来,它会是:

typeMismatch(斯威夫特。数组,Swift.DecodingError。上下文(codingPath: [], debugDescription: "期望解码数组,但发现一个字典。",底层错误:nil))

所以期望的是Converted数组,而实际上返回的是单个对象。解决方案是更新期望以匹配实际响应:

let convertedValues = try decoder.decode(Converted.self, from: data)

相关内容

最新更新