我消耗了API有时会返回:如何解码可以是String或NSNumber的JSON值?
... total: "40" ...
有时:
... total: 40 ...
是否有写保护/让语句,将抽取一个int值,而不管一个干净的方式的解析的json对象是NSString还是NSNumber?
注:我正在寻找答案如何解码的价值,而不是一个引用图书馆,让我踢解决它。我已经知道SwiftyJSON等
我消耗了API有时会返回:如何解码可以是String或NSNumber的JSON值?
... total: "40" ...
有时:
... total: 40 ...
是否有写保护/让语句,将抽取一个int值,而不管一个干净的方式的解析的json对象是NSString还是NSNumber?
注:我正在寻找答案如何解码的价值,而不是一个引用图书馆,让我踢解决它。我已经知道SwiftyJSON等
我意识到,我可以定义一个协议指定integerValue
getter和空协议扩展到NSString
和NSNumber
,然后抹上值,以该协议:
protocol HasNumber {
var integerValue: Int { get }
}
extension NSString:HasNumber{}
extension NSNumber:HasNumber{}
,然后:
guard let total = (json["total"] as? HasNumber)?.integerValue else { }
你可以使用的事实,你可以通过可选的链接调用任何方法对AnyObject
。例如:
let jsonDict : [String : AnyObject] = ["foo" : 40, "bar" : "50" ]
if let val = jsonDict["foo"]?.integerValue
{
print(val) // 40
}
if let val = jsonDict["bar"]?.integerValue
{
print(val) // 50
}
如果该键的值不存在,或不响应 到integerValue
,结果是nil
和任选的结合 失败。否则,整数值被分配到val
。
当你添加错误处理时,这对DRY来说非常麻烦。编辑:其实不,我误解了。我没有意识到你可以做到这一点。我应该尝试过,我只是假设它不起作用。 –
我想我会保持我的协议,但它使事情非常明确。 –
一种不同的方法
let jsonDict : [String : CustomStringConvertible] = ["foo" : 40, "bar" : "50" ]
for (_, value) in jsonDict {
print(Int("\(value)")!)
}
叫喊谁在生产JSON决定和一致的开发商。 – zaph
NSString和NSNumber都对.integerValue作出了响应,但我无法想到guard-let的语法,它利用了这一点,因为它没有在协议中定义。 –
嗯,我想我可以自己定义一个协议 –