无法将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响应。 这是jsonDict
variables的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 - catch
expression式的“好”分支中。
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 */ }