Swift:在字典数组上使用过滤函数?错误:无法调用'过滤'使用类型的参数列表

时间:2017-01-03 02:51:32

标签: ios arrays swift

以下此代码的目标是过滤掉具有特定ID的字典,其中ID是字符串。

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

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

  

无法调用'过滤'参数列表类型'(([String:   AnyObject])抛出 - >布尔)'

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

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

如果是这样,可能只是简单地迭代并创建一个新数组似乎更清晰。

2 个答案:

答案 0 :(得分:1)

问题不在于哈希对象不符合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 }
}

答案 1 :(得分:1)

过滤[[String:AnyObject]](a.k.a。数组>)会产生另一个[[String:AnyObject]]。您试图将此值分配给类型为$ cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto enp0s3 iface enp0s3 inet dhcp pre-up sleep 2 #VAGRANT-BEGIN # The contents below are automatically generated by Vagrant. Do not modify. auto enp0s8 iface enp0s8 inet static address 192.168.56.101 netmask 255.255.255.0 #VAGRANT-END 的var,这在Swift 3中是不允许的,因为数组是结构,而不是对象。

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

例如:

AnyObject