Swift 3.0错误:设置Dictionary值时对成员'下标'的不明确引用

时间:2017-05-05 07:06:33

标签: swift dictionary swift3

我在下面有这个方法,它将一个值插入字典中。在Swift 2.x中,它按原样运行。当切换到Swift 3时,我得到“对成员'下标'的模糊引用”错误。

任何人都可以帮助我理解原因。谢谢

private func GetNames() -> AnyObject? {
    var returnList : [NSDictionary] = []
    let list = self.Names as! [NSDictionary]
    for name in list {
        var dict : Dictionary<NSObject, AnyObject> = [:]
        dict["id"] = name["id"]      // <-- ******Error*******
        dict["name"] = name["name"]  // <-- ******Error*******
        returnList.append(dict as NSDictionary)
    }
    return returnList as AnyObject
}

2 个答案:

答案 0 :(得分:1)

在Swift 3中,String的类型为Structure,因此它不适用于NSObject,并且您声明字典的密钥类型为NSObject,这就是您的原因正在收到这个错误。要解决错误,只需将字典类型更改为[String:Any]格式[NSObject:AnyObject],然后您就可以了。

var dict : [String:Any] = [:]

注意:同样在Swift中,请不要使用NSDictionaryNSArray使用Swift的原生类型字典和数组。

答案 1 :(得分:1)

发生错误是因为Swift 3需要知道按键或索引下载的所有类型。

使用Foundation集合类型会产生反作用,因为它们缺少编译器所需的类型信息。

返回可选的AnyObject而非不同的(非可选的)[[String:Any]]也会适得其反。

解决方案是仅使用(as)特定(尽可能)的原生Swift类型。

private func getNames() -> [[String:Any]] {
    var returnList = [[String:Any]]()
    let list = self.Names as! [[String:Any]]
    for name in list {
        var dict = [String:Any]()
        dict["id"] = name["id"]
        dict["name"] = name["name"]
        returnList.append(dict)
    }
    return returnList
}

更快,如果它保证nameid两个键始终存在

private func getNames() -> [[String:Any]] {
    let list = Names as! [[String:Any]]

    return list.map { ["id" : $0["id"]!, "name" : $0["name"]!]  }
}