2015-10-19 11 views
1

我消耗了API有时会返回:如何解码可以是String或NSNumber的JSON值?

... total: "40" ...

有时:

... total: 40 ...

是否有写保护/让语句,将抽取一个int值,而不管一个干净的方式的解析的json对象是NSString还是NSNumber?

注:我正在寻找答案如何解码的价值,而不是一个引用图书馆,让我踢解决它。我已经知道SwiftyJSON等

+3

叫喊谁在生产JSON决定和一致的开发商。 – zaph

+0

NSString和NSNumber都对.integerValue作出了响应,但我无法想到guard-let的语法,它利用了这一点,因为它没有在协议中定义。 –

+0

嗯,我想我可以自己定义一个协议 –

回答

0

我意识到,我可以定义一个协议指定integerValue getter和空协议扩展到NSStringNSNumber,然后抹上值,以该协议:

protocol HasNumber { 
    var integerValue: Int { get } 
} 
extension NSString:HasNumber{} 
extension NSNumber:HasNumber{} 

,然后:

guard let total = (json["total"] as? HasNumber)?.integerValue else { } 
1

你可以使用的事实,你可以通过可选的链接调用任何方法对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

+0

当你添加错误处理时,这对DRY来说非常麻烦。编辑:其实不,我误解了。我没有意识到你可以做到这一点。我应该尝试过,我只是假设它不起作用。 –

+0

我想我会保持我的协议,但它使事情非常明确。 –

0

一种不同的方法

let jsonDict : [String : CustomStringConvertible] = ["foo" : 40, "bar" : "50" ] 
for (_, value) in jsonDict { 
    print(Int("\(value)")!) 
} 
相关问题