我消耗的API有时会返回:
...
total: "40"
...
有时候:
...
total: 40
...
是否有一种干净的方法来编写一个guard / let语句,它将提取一个int值,无论解析的json对象是NSString还是NSNumber?
注意:我正在寻找如何解码值的答案,而不是对允许我解决问题的库的引用。我已经了解SwiftyJSON等。
答案 0 :(得分: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
。
答案 1 :(得分:0)
我意识到我可以定义一个协议,为integerValue
和NSString
指定NSNumber
getter和空协议扩展,然后将值转换为该协议:
protocol HasNumber {
var integerValue: Int { get }
}
extension NSString:HasNumber{}
extension NSNumber:HasNumber{}
然后:
guard let total = (json["total"] as? HasNumber)?.integerValue else { }
答案 2 :(得分:0)
一种不同的方法
let jsonDict : [String : CustomStringConvertible] = ["foo" : 40, "bar" : "50" ]
for (_, value) in jsonDict {
print(Int("\(value)")!)
}