Isu*_*uru 67 double ios nsjsonserialization swift
我有一个像这样的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
}
}
Run Code Online (Sandbox Code Playgroud)
从API,我得到以下JSON响应.这是jsonDict变量的println .
[
"totalfup": 96.340899,
"totalrem": 3548710948
]
Run Code Online (Sandbox Code Playgroud)
当我尝试将totalfup属性的值分配给属性时totalData,我收到此错误.
无法将"NSTaggedPointerString"类型的值转换为"NSNumber"
谁知道为什么?我尝试将属性类型更改为float然后将整个结构更改为类但仍然会出现问题.
tul*_*dev 100
出错的原因jsonDict["totalfup"]是String(NSTaggedPointerString是其子类NSString),因此您应该将String转换为Double.
请确保,在强制解包之前捕获异常并检查类型!
totalData = (jsonDict["totalfup"] as! NSString).doubleValue
Run Code Online (Sandbox Code Playgroud)
为安全起见,使用if let:
if let totalfup = (dict["totalfup"] as? NSString)?.doubleValue {
// here, totalfup is a Double
}
else {
// dict["totalfup"] isn't a String
}
Run Code Online (Sandbox Code Playgroud)
小智 17
我想这可以帮到你
totalData = Double(jsonDict["totalfup"] as! String)!
Run Code Online (Sandbox Code Playgroud)
失败原因是 JSON 返回String值,而不是数字。
如果返回的 JSON 数据仅包含这两个键值对,则将类型声明为 以[String:String]避免类型转换。
无论如何,您都必须将更新变量的代码放入表达式的“good”分支中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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48952 次 |
| 最近记录: |