我有一个这样的Swift结构。
struct Usage {
var totalData: Double
var remainingTotalData: Double
init(jsonData: NSData) {
var jsonDict = [String: AnyObject]()
do {
jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! [String: AnyObject]
} catch {
print("Error occurred parsing data: \(error)")
}
totalData = jsonDict["totalfup"] as! Double
remainingTotalData = jsonDict["totalrem"] as! Double
}
}
从API中,我得到以下JSON响应。这是jsonDict
变量的println。
[
"totalfup": 96.340899,
"totalrem": 3548710948
]
当我试图将totalfup
的值赋给属性totalData
时,我得到了这个错误。
无法将'NSTaggedPointerString‘类型的值强制转换为'NSNumber'
有人知道为什么吗?我尝试将属性类型更改为float
,然后将整个结构更改为类,但仍然出现问题。
发布于 2015-10-23 17:43:40
错误的原因是jsonDict["totalfup"]
是一个字符串(NSTaggedPointerString
是NSString
的子类),所以您应该将String转换为Double。
在强制展开之前,请确保捕获异常并检查类型!
totalData = (jsonDict["totalfup"] as! NSString).doubleValue
对于安全,使用if let
// check dict["totalfup"] is a String?
if let totalfup = (dict["totalfup"] as? NSString)?.doubleValue {
// totalfup is a Double here
}
else {
// dict["totalfup"] isn't a String
// you can try to 'as? Double' here
}
发布于 2016-03-10 20:39:55
我想这对你有帮助
totalData = Double(jsonDict["totalfup"] as! String)!
发布于 2015-10-23 17:56:06
失败的原因是JSON返回的是String
值,而不是数字。
如果返回的JSON数据只包含这两个键值对,则将类型声明为[String:String]
,从而避免类型转换。
在任何情况下,您都必须将更新变量的代码放入do - catch
表达式的“好”分支。
struct Usage {
var totalData = 0.0
var remainingTotalData = 0.0
init(jsonData: NSData) { // Swift 3: Data
do {
let jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! [String: String]
// Swift 3: let jsonDict = try NSJSONSerialization.jsonObject(with: jsonData) as! [String: String]
totalData = Double(jsonDict["totalfup"]!)
remainingTotalData = Double(jsonDict["totalrem"]!)
} catch {
print("Error occurred parsing data: \(error)")
}
}
}
https://stackoverflow.com/questions/33299202
复制相似问题