我正在消费的API有时会返回:
... total: "40" ...
有时:
... total: 40 ...
是否有一种清晰的方法可以编写一个无论已解析的json对象是NSString还是NSNumber都将提取int值的守护/let语句?
注意:我正在寻找如何解码这个值的答案,而不是引用一个库,它允许我解决这个问题。我已经知道SwiftyJSON等了。
发布于 2015-10-19 19:56:04
我意识到我可以定义一个协议,指定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 { }
发布于 2015-10-19 19:58:31
您可以使用这样的事实:您可以通过可选链接在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
。
发布于 2015-10-19 21:01:58
另一种方法
let jsonDict : [String : CustomStringConvertible] = ["foo" : 40, "bar" : "50" ]
for (_, value) in jsonDict {
print(Int("\(value)")!)
}
https://stackoverflow.com/questions/33222572
复制相似问题