我有这个功能:
typealias KeyValue = Dictionary<String,AnyObject>
func response( response: NSHTTPURLResponse!, data: AnyObject!, error: NSError! ) {
var resData = data as NSDictionary
if( resData["status"] as Int == 1 ){
var content = resData["content"] as Array<KeyValue>
for player in content {
let id : Int = player["id"]
let score : Int = player["score"]
let name : String = player["name"]
players[ id ]!.setName( name )
players[ id ]!.setScore( score )
}
} else {
println( resData["error"] )
}
self.playersList.reloadData()
}
我收到了这个错误:
“(String, AnyObject)”不可转换为“Int”
在这条线上
let id : Int = player["id"]
let score : Int = player["score"]
let name : String = player["name"]
我不明白为什么
内容是数组
-> 播放器是键值
-> 播放器是字典
-> player["id"] 是 AnyObject
那么他为什么认为 player["id"] 是'(String, AnyObject)'??
谢谢
更新
对此错误进行更改:
let id = player["id"]! as Int
let score = player["score"]! as Int
let name = player["name"]! as String
但现在我在运行时得到了这个:
Thread 5: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT,subcode=0xdefe)
最佳答案
player
在你的循环中是 Dictionary<String, AnyObject>
的一个实例.所以存储在该字典中的值是 AnyObject
的实例.
在这一行中:
let id : Int = player["id"]
您正在尝试从 AnyObject
进行隐式转换至 Int
,这是不可能的。正确的处理方法是:
- 解包从字典中提取的值(如果键不存在,它可以是
nil
) - 明确转换为
Int
所以该行应该固定如下:
let id : Int = player["id"]! as Int
也可以缩写为:
let id = player["id"]! as Int
类似的规则适用于 score
和 name
附录 - 根据您的上一个错误,可能是由于字典中没有键。尝试像这样使用可选值:
let id = (player["id"] as AnyObject?) as? Int
let score = (player["score"] as AnyObject?) as? Int
let name = (player["name"] as AnyObject?) as? String
你有 3 个可选变量,它们得到 nil
如果右侧相应的表达式计算为 nil
.如果可行,请使用调试器检查哪个键不在字典中
关于ios - 快速字典错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768210/