以下此代码的目标是过滤掉具有特定ID的字典,其中ID是字符串。
let dictArray = networkData["dicts"] as! [[String:AnyObject]]
localData["dicts"] = dictArray.filter{ ($0["id"] as! String) != sample.getId() }
但是,此代码会生成错误:
无法调用'过滤'参数列表类型'(([String: AnyObject])抛出 - >布尔)'
根据其他SO答案,例如this one和this one,似乎错误是词典不符合Equatable
。
使用filter
创建自定义类来保存字典数组并使该类符合Equatable
的唯一选项是什么?
如果是这样,可能只是简单地迭代并创建一个新数组似乎更清晰。
答案 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