我从服务器获取json。我使用以下代码:
self.socket.on("contactList") {data, ack in
let resultData = (data.first as! String).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let jsonResult: Dictionary = NSJSONSerialization.JSONObjectWithData(resultData!, options: NSJSONReadingOptions.MutableContainers) as! Dictionary<String, AnyObject>
let results: NSArray = jsonResult["result"] as! NSArray
for item in results {
let username = item["username"] as! String
}
}
但是我遇到了编译错误:
Cannot subscript a value of type 'Element' (aka 'AnyObject') with an index of type 'String'
这一行:
let username = item["username"] as! String
我该如何解决?
我没有得到任何错误swift 1.2但是现在我正在迁移到2.0而我无法解决这个问题。
我的xcode版本是7.0(7A220)
答案 0 :(得分:1)
我认为results
是字典数组。然后:
let results = jsonResult["result"] as! [[String: AnyObject]]
当然,我建议安全打开所有内容,而不是使用强制解包来避免崩溃。如果发生网络错误会发生什么? (崩溃)
答案 1 :(得分:0)
item
是AnyObject
。这不是字典,你不能下标。按照你的风格,你可能意味着:
// Results are expected to be an array of dictionaries of string->string
let results = jsonResult["result"] as! [[String:String]]
for item in results {
let username = item["username"]
}
但请注意,这是非常危险的代码。如果服务器向您发送了您不期望的任何内容,您的程序将崩溃。您真的需要使用as?
更仔细地卸载这些数据,以确保您获得自己想要的方式。然后将该数据加载到自定义struct
类型中,这样您就不必在程序的其余部分中对其进行测试。
答案 2 :(得分:0)
您必须先将项目转换为词典。
if let dic = item as Dictionary {
let username = dic["username"] as! String
}
答案 3 :(得分:0)
我有类似的问题,试试这个:
let results: [String:AnyObject] = jsonResult["result"] as! [String:AnyObject]