我在下面有这个方法,它将一个值插入字典中。在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
}
答案 0 :(得分:1)
在Swift 3中,String
的类型为Structure
,因此它不适用于NSObject
,并且您声明字典的密钥类型为NSObject
,这就是您的原因正在收到这个错误。要解决错误,只需将字典类型更改为[String:Any]
格式[NSObject:AnyObject]
,然后您就可以了。
var dict : [String:Any] = [:]
注意:同样在Swift中,请不要使用NSDictionary
和NSArray
使用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
}
或更快,如果它保证name
和id
两个键始终存在
private func getNames() -> [[String:Any]] {
let list = Names as! [[String:Any]]
return list.map { ["id" : $0["id"]!, "name" : $0["name"]!] }
}