我试过了
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”
我在下面添加了res [4]的转储
我和Swift一样新,我不知道其他任何事情要尝试
答案 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
可选将值直接绑定到Int
(NSNumber
隐式桥接到Int
)并使用String
初始值设定项。
if let roleID = res["adc_role_id"] as? Int {
self.adc_role_id = String(roleID)
}
请遵守变量名 camelCased 的命名约定,而不是 snake_cased