首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法将'NSTaggedPointerString‘类型的值强制转换为'NSNumber’

无法将'NSTaggedPointerString‘类型的值强制转换为'NSNumber’
EN

Stack Overflow用户
提问于 2015-10-23 17:37:33
回答 7查看 58.3K关注 0票数 74

我有一个这样的Swift结构。

代码语言:javascript
复制
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变量的println。

代码语言:javascript
复制
[
    "totalfup": 96.340899, 
    "totalrem": 3548710948
]

当我试图将totalfup的值赋给属性totalData时,我得到了这个错误。

无法将'NSTaggedPointerString‘类型的值强制转换为'NSNumber'

有人知道为什么吗?我尝试将属性类型更改为float,然后将整个结构更改为类,但仍然出现问题。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-10-23 17:43:40

错误的原因是jsonDict["totalfup"]是一个字符串(NSTaggedPointerStringNSString的子类),所以您应该将String转换为Double。

在强制展开之前,请确保捕获异常并检查类型!

代码语言:javascript
复制
totalData = (jsonDict["totalfup"] as! NSString).doubleValue

对于安全,使用if let

代码语言:javascript
复制
// check dict["totalfup"] is a String?
if let totalfup = (dict["totalfup"] as? NSString)?.doubleValue {
  // totalfup is a Double here 
}
else {
  // dict["totalfup"] isn't a String
  // you can try to 'as? Double' here
}
票数 111
EN

Stack Overflow用户

发布于 2016-03-10 20:39:55

我想这对你有帮助

代码语言:javascript
复制
totalData = Double(jsonDict["totalfup"] as! String)!
票数 20
EN

Stack Overflow用户

发布于 2015-10-23 17:56:06

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

如果返回的JSON数据只包含这两个键值对,则将类型声明为[String:String],从而避免类型转换。

在任何情况下,您都必须将更新变量的代码放入do - catch表达式的“好”分支。

代码语言:javascript
复制
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)")
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33299202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档