我是Swift 4的新手,我花了几个小时来寻找解决问题的方法。
import Foundation
public struct Coin: Codable {
let name: String //= "Default"
let symbol: String
}
open class CoinCapIOAPI {
func fetchMap() {
let urlString = "http://socket.coincap.io/map"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
// Maybe later...
guard let data = data else { return }
do {
let coins = try JSONDecoder().decode([Coin].self, from: data)
print(coins)
} catch let jsonErr {
print("Error: ", jsonErr)
}
}.resume()
}
}JSON看起来像:
[
{ aliases: [ ],
name: "300 Token",
symbol: "300",
},
{
aliases: [ ],
name: "SixEleven",
symbol: "611",
},
]我只需要name和symbol。但是,如果在结构中没有默认的名称,我会得到以下错误:
错误:_12768CA107A31EF2DCE034FD75B541C9)(stringValue:(CoinBartender.Coin.(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath: Foundation.)(_JSONKey在_JSONKey中“索引91",intValue:可选(91)),debugDescription:”没有与键名关联的值(\“name \”)。“,underlyingError: 0)
如果我添加"name“的默认值,就会得到以下结果:
[CoinBartender.Coin(名称:“默认”,符号:"300"),CoinBartender.Coin(名称:“默认”,符号:"611"),
为什么symbol能工作,而name却不能工作?
发布于 2017-12-17 19:54:32
请仔细阅读错误信息。它准确地描述了这个问题:
错误:keyNotFound(CoinBartender.Coin.(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath: Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:"Index 91",intValue:可选(91)),debugDescription:"No值与键名(\“name \”.“,underlyingError: nil)关联)
它说第92项(索引是基于零的)没有键name。
{"aliases":[],"symbol":"QTM"} 一个解决方案是将name声明为可选的
let name: String?发布于 2017-12-17 19:54:39
你的硬币结构应该是这样:
public struct Coin: Codable {
let name: String? //= "Default"
let symbol: String
}因为某些索引不包含name。
https://stackoverflow.com/questions/47858723
复制相似问题