我可以比较2个字典是否匹配:
func ==(lhs: [String: AnyObject],rhs: [String: AnyObject] ) -> Bool { return NSDictionary(dictionary: lhs).isEqualToDictionary(rhs) }
解决方法
我们可以定义一个运算符来检查2个字典是否包含相同的键,并且每个键包含相同的值.
值必须是Equatable
首先,我们需要使用泛型来要求字典的值符合Equatable,否则我们将无法比较这些值.
这是代码
func ==<Value:Equatable>(left: [String: Value],right: [String: Value]) -> Bool { guard left.keys.count == right.keys.count else { return false } let differenceFound = zip(left.keys.sort(),right.keys.sort()).contains { elm -> Bool in let leftKey = elm.0 let rightKey = elm.1 return leftKey != rightKey || left[leftKey] != right[rightKey] } return !differenceFound }
第一行验证字典具有相同数量的条目,否则返回false.
下一个代码块对两个字典的键进行排序,并比较每对字符串,以查找键或值不同的一对.
如果没有找到这样的差异,那么词典具有相同的键和值,因此它们是等于的.
例子
["a":1,"b": 2] == ["a":1,"b": 2] // true
当然,由于词典中的值没有订单,因此仍然如此
["a":1,"b": 2] == ["b":2,"a": 1] // true
["a":1,"b": 2,"c": 3] // false
!=运算符
由于我们定义了==运算符,Swift给我们提供了!=运算符(它只返回==的反面),所以我们也可以写
["a":1,"b": 2] != ["d":4] // true
更短的版本
也可以用这种较短的方式编写相同的运算符
func ==<Value:Equatable>(left: [String: Value],right: [String: Value]) -> Bool { return left.keys.count == right.keys.count && !zip(left.keys.sort(),right.keys.sort()).contains { $0 != $1 || left[$0] != right[$1] } }
更新
现在给出2个词典a和b,你想要执行a.minus(b)并得到一个新的词典,其中包含a中可用的所有(键,值)对,而b中没有.
这是代码
extension Dictionary where Key: Comparable,Value: Equatable { func minus(dict: [Key:Value]) -> [Key:Value] { let entriesInSelfAndnotinDict = filter { dict[$0.0] != self[$0.0] } return entriesInSelfAndnotinDict.reduce([Key:Value]()) { (res,entry) -> [Key:Value] in var res = res res[entry.0] = entry.1 return res } } }
例子
["a":1].minus(["a":2]) // ["a": 1] ["a":1].minus(["a":1]) // [:] ["a":1].minus(["a":1,"b":2]) // [:] ["a":1,"b": 2].minus(["a":1]) // ["b": 2]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。