无法将types“NSTaggedPointerString”的值转换为“NSNumber”

我有这样的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响应。 这是jsonDictvariables的println。

 [ "totalfup": 96.340899, "totalrem": 3548710948 ] 

当我尝试将totalfup的值分配给属性totalData ,出现此错误。

无法将types“NSTaggedPointerString”的值转换为“NSNumber”

有人知道为什么 我试着改变属性types为float ,然后整个结构类,但仍然发生问题。

错误的原因是jsonDict["totalfup"]是一个string,所以你应该把string转换为双jsonDict["totalfup"]

请确保在强制解包之前捕获exception和检查types

 totalData = (jsonDict["totalfup"] as! NSString).doubleValue 

为了安全,使用if let

 if let totalfup = (dict["totalfup"] as? NSString)?.doubleValue { } 

我认为这可以帮助你

 totalData = Double(jsonDict["totalfup"] as! String)! 

失败的原因是JSON返回String值,而不是数字。

如果返回的JSON数据仅包含这两个键值对,则将types声明为避免types转换的[String:String]

无论如何,你必须把代码更新到do - catchexpression式的“好”分支中。

 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)") } } } 

为什么不直接使用Swift的本地types?

 import Foundation struct Usage { var totalData: Double = 0 var remainingTotalData: Double = 0 init(jsonData: NSData) { do { if let jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as? [String:Double] { totalData = jsonDict["totalfup"] ?? 0 remainingTotalData = jsonDict["totalrem"] ?? 0 } } catch { print("Error occurred parsing data: \(error)") } } } if let data = "{\"totalfup\":96.340899,\"totalrem\":3548710948}".dataUsingEncoding(NSUTF8StringEncoding) { let usage = Usage(jsonData: data) dump(usage) /* ▿ Usage - totalData: 96.340899 - remainingTotalData: 3548710948.0 */ }