Swift 3.0 错误:设置字典值时对成员'subscript'的引用不明确



我在下面有此方法,该方法将值插入字典中。在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
}

在swift 3 String中是 Structure的类型,因此它无法与 NSObject一起使用,并且您已经声明词典,这就是关键类型是 NSObject,这是您遇到该错误的原因。要解决错误,只需将字典的类型更改为 [String:Any]表单 [NSObject:AnyObject]即可。

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

注意:在Swift中也不要使用NSDictionaryNSArray使用Swift的本机类型字典和数组。

发生了错误,因为Swift 3需要了解所有由密钥或索引订阅的类型。

使用基础收集类型是适得其反的,因为它们缺乏编译器需求的类型信息。

返回可选的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
}

swiftier 如果保证键nameid始终存在

private func getNames() -> [[String:Any]] {
    let list = Names as! [[String:Any]]
    return list.map { ["id" : $0["id"]!, "name" : $0["name"]!]  }
}

最新更新