Swift 4:无法将'__NSCFNumber'类型的值转换为'NSString'

时间:2018-02-18 02:06:36

标签: swift xcode

我试过了

self.adc_role_id = String(res["adc_role_id"])

self.adc_role_id = "\(res["adc_role_id']"

self.adc_role_id = (\(res["adc_role_id"] as? String)!

但仍然得到

  

无法将“__NSCFNumber”类型的值转换为“NSString”

enter image description here

我在下面添加了res [4]的转储

我和Swift一样新,我不知道其他任何事情要尝试

3 个答案:

答案 0 :(得分:5)

在Swift 4中,String初始值设定项需要describing:参数标签。

我不知道这是否能解决您的问题,但您的第一行代码应该写成:

self.adc_role_id = String(describing: res["adc_role_id"])

答案 1 :(得分:2)

在屏幕截图中,我们可以看到res["adc_role_id"]是一个NSNumber。

要将NSNumber转换为String,您应该使用其stringValue属性。

由于字典提供了Optional,您应该使用可选绑定来安全地打开它。

示例:

if let val = res["adc_role_id"] {
    self.adc_role_id = val.stringValue
}

如果需要,您还可以使用字符串插值而不是属性:

if let val = res["adc_role_id"] {
    self.adc_role_id = "\(val)"
}

但我认为使用该属性更具相关性。

如果出于某种原因,编译器会抱怨内容的类型,请将其强制转换为:

if let val = res["adc_role_id"] as? NSNumber {
    self.adc_role_id = val.stringValue
}

请注意,使用String(describing:),因为此初始值设定项会尝试以多种方式表示字符串,其中一些将提供不准确且意外的结果(例如,如果{ {1}}解析为使用String(describing:)属性,如文档中所述,您可能会获得与您想要的字符串完全不同的字符串。

还值得注意的是,将debugDescription与可选值(例如字典)一起使用会解析为错误的字符串:String(describing:)会给String(describing: res["adc_role_id"])!这就是Mike的答案错误的原因。小心这个。我的建议是完全避免使用Optional(yourNumber),除非出于调试目的。

答案 2 :(得分:0)

错误消息已清除,转储也已清除。

该值不是String,而是Int(64)包裹在NSNumber

可选将值直接绑定到IntNSNumber隐式桥接到Int)并使用String初始值设定项。

if let roleID = res["adc_role_id"] as? Int {
    self.adc_role_id = String(roleID)
}

请遵守变量名 camelCased 的命名约定,而不是 snake_cased