【问题标题】:handling "Could not cast value of type 'NSTaggedPointerString' to 'NSNumber' "处理“无法将'NSTaggedPointerString'类型的值转换为'NSNumber'”
【发布时间】:2017-08-31 14:09:23
【问题描述】:

我有一个转换为字典对象的 json。转储时,您可以看到返回以下内容

▿ (2 elements)
  - key: "LivingArea"
  - value: NULL #2
    - super: NSString
      - super: NSObject

假设 userDict 是我的字典对象

let LivingArea = userDict?["LivingArea"] as? Int

返回:可选(5)

但我需要打开它,所以我尝试

let LivingArea = userDict?["LivingArea"] as! Int

这会使应用程序崩溃,原因如下: 无法将类型“NSTaggedPointerString”(0x111601d60)的值转换为“NSNumber”(0x110c0e4a8)。

我如何获得 LivingArea 展开的价值。为什么它的行为不像 Int? 这是json的一个例子

["District": 4, "Napa": 43, "LivingArea": 2, "CityName": LA, "CityCode": 1103]

谢谢

【问题讨论】:

  • 该错误清楚地表明该值是string 而不是(NS)number。请以小写字母开头命名变量。
  • 似乎并非您的 JSON 中的所有条目都具有 LivingArea 的数值。您应该将变量保留为可选,并在需要时将其解包。不要强行打开,否则你会崩溃。另一种选择是使用 let livingArea = userDict?["LivingArea"] as? Int ?? 0 设置默认值 0
  • @AshokKumarReddyPolu 我得到以下信息:无法使用类型为“(Any?)”的参数列表调用类型“Int”的初始化程序
  • 是的,忽略这个建议。它仍然有一个强制展开,所以它会在缺少值时崩溃
  • @Paulw11 成功了。谢谢

标签: swift


【解决方案1】:

似乎并非 JSON 中的所有条目都具有 LivingArea 的数值。

一种选择是将变量保留为可选项,并在需要时将其解包。不要强制解包,否则当值丢失或没有整数时会崩溃。

您应该进行防御性编码,尤其是在处理来自外部来源的数据时。

另一个选项是使用

设置默认值 0
let livingArea = userDict?["LivingArea"] as? Int ?? 0

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多