无法将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 */ }