我有2本字典:
let foo: [String: Any] = ["name": "John", "isHuman": true, "age": 20]
let bar: [String: Any] = ["name": "Ann", "isHuman": true, "age": 34]
我想进行比较,同时从该比较中排除某些键。我要排除的键在另一本词典中:
let car: [String: Any] = ["age": 20]
我有这个扩展名:
extension Dictionary where Key: Equatable {
func isEqualTo(_ dictionary: Dictionary, excluding: [Key] = []) -> Bool {
let left = filter({ !excluding.contains($0.key) })
let right = dictionary.filter({ !excluding.contains($0.key) })
return NSDictionary(dictionary: left).isEqual(to: right)
}
}
但是当我调用它时,我需要将排除的键包装在中Array
,否则编译器将失败并显示:
无法将类型“ Dictionary.Keys”的值转换为预期的参数类型“ [String]”
foo.isEqualTo(bar, excluding: Array(car.keys))
作品。
foo.isEqualTo(bar, excluding: car.keys)
导致编译器错误。
我是否可以通过某种方式调整扩展名,从而避免将排除的密钥包装在其中Array
?
car.keys
具有type Dictionary<Key, Value>.Keys
,它是一个集合而不是数组。
如果将函数声明为
func isEqualTo<C: Collection>(_ dictionary: Dictionary, excluding: C) -> Bool
where C.Element == Key
然后两者
foo.isEqualTo(bar, excluding: Array(car.keys))
foo.isEqualTo(bar, excluding: car.keys)
编译和工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句