无法将"NSTaggedPointerString"类型的值转换为"NSNumber"

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)

  • 谢谢!那奏效了。你知道这是为什么吗?回到 Swift 1.2,我们不必转换为 `NSString`,对吗? (2认同)

小智 17

我想这可以帮到你

totalData = Double(jsonDict["totalfup"] as! String)!
Run Code Online (Sandbox Code Playgroud)


vad*_*ian 5

失败原因是 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)