我在下面有此方法,该方法将值插入字典中。在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中也不要使用NSDictionary
,NSArray
使用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 如果保证键name
和id
始终存在
private func getNames() -> [[String:Any]] {
let list = Names as! [[String:Any]]
return list.map { ["id" : $0["id"]!, "name" : $0["name"]!] }
}