【问题标题】:Swift: use filter function on array of dictionaries? Error: Cannot invoke 'filter' with an argument list of typeSwift:在字典数组上使用过滤器功能?错误:无法使用类型参数列表调用“过滤器”
【发布时间】:2017-01-03 02:51:31
【问题描述】:

下面这段代码的目的是过滤掉具有特定 ID 的字典,其中 ID 是一个字符串。

    let dictArray = networkData["dicts"] as! [[String:AnyObject]]
    localData["dicts"] = dictArray.filter{ ($0["id"] as! String) != sample.getId() }

但是,此代码会产生错误:

不能使用类型为 '(([String : AnyObject]) 抛出 -> Bool)'

根据 this onethis one 等其他 SO 答案,似乎错误是字典不符合 Equatable

那么使用filter 创建一个自定义类来保存字典数组并使该类符合Equatable 的唯一选择是什么?

如果是这样,也许简单地迭代并创建一个新数组似乎更简洁。

【问题讨论】:

  • 什么是散列对象
  • 请务必定义filteredData: [String: [[String: AnyObject]]]
  • @Alexander 他的意思可能是字典
  • @matt 这就是我的怀疑,但他没有在任何地方比较字典的相等性
  • 我建议将let id = sample.getId()从过滤器块中声明出来并使用id代替。

标签: ios arrays swift


【解决方案1】:

过滤 [[String:AnyObject]] (a.k.a. Array>) 会产生另一个 [[String:AnyObject]]。您正在尝试将其分配给 AnyObject 类型的 var,这在 Swift 3 中是不允许的,因为数组是结构,而不是对象。

创建一个类型安全的结构或对象来保存这些数据,而不是一个字典。

例如:

let dictArray = networkData["dicts"] as! [[String:AnyObject]]
let filteredDicts = dictArray.filter{ ($0["id"] as! String) != sample.getId() }         
localData["dicts"] = filteredDicts

【讨论】:

  • 谢谢!但准确地说,我们将字典数组分配给 AnyObject 类型的 var(这在 swift 中也不起作用)。
  • @Crashalot 好点。你可以补充我的答案。如果有帮助请采纳
  • 已经投票了。只是没有接受,因为仍然需要修复代码。 :) 如果这导致解决方案,请不要担心你会得到积分。 :)
  • 顺便说一句,为什么这在 swift 2.x 而不是 swift 3.x 中有效?也将是有价值的评论。
  • Swift 2 允许隐式桥接到 Foundation 类型,例如从 ArrayNSArray(这是一个类)。这种桥接已在 Swift 3 中明确说明,以减少对 Foundation 类型的依赖。
【解决方案2】:

问题不在于哈希对象不符合Equatable,因为您使用String 进行比较。

我的代码在 Playground 中运行良好:

// 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 }
}

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多