我是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
。但是如果没有结构中的默认名称,我会收到以下错误:
错误:keyNotFound(CoinBartender.Coin。(_7C60C6A5E9E301137DE95AF645AB94EB中的CodingKeys).name,Swift.DecodingError.Context(codingPath:[Foundation。(_ _ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:“Index 91”,intValue:Optional(91)) ],debugDescription:“没有与键名相关的值(\”name \“)。”,underlyingError:nil))
如果我为“name”添加默认值,我会得到以下结果:
[CoinBartender.Coin(名称:“默认”,符号:“300”),CoinBartender.Coin(名称:“默认”,符号:“611”),
为什么symbol
有效但name
没有?
答案 0 :(得分:2)
请仔细阅读错误消息。它正是在描述这个问题:
错误: keyNotFound (CoinBartender.Coin。(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath:[Foundation。(_ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:“ Index 91 “,intValue:Optional(91))],debugDescription:”没有与键名相关的值(\“name \”)。“,underlyingError:nil))
它表示第92个条目(索引从零开始)没有键name
{"aliases":[],"symbol":"QTM"}
一种解决方案是将name
声明为可选
let name: String?
答案 1 :(得分:0)
你的Coin结构应该是这样的:
public struct Coin: Codable {
let name: String? //= "Default"
let symbol: String
}
因为某些索引不包含name
。