Ios Swift:在字典数组上使用过滤函数?错误:无法调用';过滤器';具有类型为的参数列表
下面这段代码的目标是筛选出具有特定ID的字典,其中ID是一个字符串Ios Swift:在字典数组上使用过滤函数?错误:无法调用';过滤器';具有类型为的参数列表,ios,arrays,swift,Ios,Arrays,Swift,下面这段代码的目标是筛选出具有特定ID的字典,其中ID是一个字符串 let dictArray = networkData["dicts"] as! [[String:AnyObject]] localData["dicts"] = dictArray.filter{ ($0["id"] as! String) != sample.getId() } 但是,此代码会生成一个错误: 无法使用类型为“”的参数列表调用“筛选器”([String: AnyObject])抛出->Boo
let dictArray = networkData["dicts"] as! [[String:AnyObject]]
localData["dicts"] = dictArray.filter{ ($0["id"] as! String) != sample.getId() }
但是,此代码会生成一个错误:
无法使用类型为“”的参数列表调用“筛选器”([String:
AnyObject])抛出->Bool)'
根据和等其他SO答案,似乎错误在于字典不符合equalable
因此,使用filter
创建自定义类以保存字典数组并使该类符合equalable
的唯一选项是什么
如果是这样的话,简单地迭代并创建一个新数组似乎更干净。问题不在于哈希对象不符合
equalable
,因为您使用String
进行比较
我的代码在操场上运行良好:
// make sure data is type of [String: [[String: AnyObject]]]
// make sure filteredData is type of [String: [[String: AnyObject]]]
let key = "hashes"
if let hashArray = data[key] {
let id = sample.getId() // make sure it's String type
filteredData[key] = hashArray.filter { ($0["id"] as? String) != id }
}
问题不在于哈希对象不符合
equalable
,因为您正在使用String
进行比较
我的代码在操场上运行良好:
// make sure data is type of [String: [[String: AnyObject]]]
// make sure filteredData is type of [String: [[String: AnyObject]]]
let key = "hashes"
if let hashArray = data[key] {
let id = sample.getId() // make sure it's String type
filteredData[key] = hashArray.filter { ($0["id"] as? String) != id }
}
过滤[[String:AnyObject]](又称数组>)会产生另一个[[String:AnyObject]]。您试图将其分配给类型为
AnyObject
的变量,这在Swift 3中是不允许的,因为数组是结构,而不是对象
创建一个类型安全的结构或对象来保存此数据,而不是dict
例如:
let dictArray = networkData["dicts"] as! [[String:AnyObject]]
let filteredDicts = dictArray.filter{ ($0["id"] as! String) != sample.getId() }
localData["dicts"] = filteredDicts
过滤[[String:AnyObject]](又称数组>)会产生另一个[[String:AnyObject]]。您试图将其分配给类型为
AnyObject
的变量,这在Swift 3中是不允许的,因为数组是结构,而不是对象
创建一个类型安全的结构或对象来保存此数据,而不是dict
例如:
let dictArray = networkData["dicts"] as! [[String:AnyObject]]
let filteredDicts = dictArray.filter{ ($0["id"] as! String) != sample.getId() }
localData["dicts"] = filteredDicts
什么是散列对象?请确保您定义了
filteredData:[String:[[String:AnyObject]]]
@Alexander他可能是指dictionaries@matt这正是我所怀疑的,但他并没有比较字典的相等性,我建议declarelet id=sample.getId()
从筛选器块中删除,并使用id而不是。什么是哈希对象?请确保您定义了筛选器数据:[String:[[String:AnyObject]]]
@Alexander他可能是指dictionaries@matt这就是我所怀疑的,但他并没有在任何地方比较字典的相等性,我建议从过滤器块中声明let id=sample.getId()
,并使用id代替。谢谢!但准确地说,我们将字典数组分配给类型为AnyObject
(在swift中也不起作用)的变量。@Crashalot说得不错。你可以补充我的答案。如果它有助于提高投票率,请接受它。仅未接受,因为仍需要修复代码。:)不要担心,如果这导致了解决方案,您将获得分数。:)顺便说一句,为什么这在swift 2.x中有效,而不是在swift 3.x中有效?SWIFT 2允许对基础类型进行隐式桥接,例如从<代码>数组 > <代码> NSArray < /Cl> >(这是一个类)。在Swift 3中明确了这一桥接,以减少对基础类型的依赖。谢谢!但准确地说,我们将字典数组分配给类型为AnyObject
(在swift中也不起作用)的变量。@Crashalot说得不错。你可以补充我的答案。如果它有助于提高投票率,请接受它。仅未接受,因为仍需要修复代码。:)不要担心,如果这导致了解决方案,您将获得分数。:)顺便说一句,为什么这在swift 2.x中有效,而不是在swift 3.x中有效?SWIFT 2允许对基础类型进行隐式桥接,例如从<代码>数组 > <代码> NSArray < /Cl> >(这是一个类)。在SWIFT 3中明确了这种桥接,以减少对地基类型的依赖。