Swift 2无法下标类型错误

时间:2015-09-25 14:19:09

标签: ios swift

我从服务器获取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)

4 个答案:

答案 0 :(得分:1)

我认为results是字典数组。然后:

    let results = jsonResult["result"] as! [[String: AnyObject]]

当然,我建议安全打开所有内容,而不是使用强制解包来避免崩溃。如果发生网络错误会发生什么? (崩溃)

答案 1 :(得分:0)

itemAnyObject。这不是字典,你不能下标。按照你的风格,你可能意味着:

// 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]