所以我想把同一类型的两本词典等同起来。[AnyLanguage: SortedList<String>]
符合AnyLanguage
,因此也符合Hashable
,所以这不是问题。另一方面,Equatable
不符合SortedList
,因为它是Equatable
的泛型,没有限制:
public struct SortedList<Element> { ... }
现在,我已经实现了
Element
的相等运算符,当它的SortedList
符合Elements
时:public func ==<T: Equatable>(left: SortedList<T>, right: SortedList<T>) -> Bool
现在,当比较上述两个词典时:
let dictA: [AnyLanguage: SortedList<String>] = [:]
let dictB: [AnyLanguage: SortedList<String>] = [:]
dictA == dictB
我得到以下错误:
我假设编译器在抱怨,因为
Equatable
不符合SortedList
,即使我已经实现了equatableEquatable
s的比较运算符(它可以使用,因为Element
是equatable)。我如何比较这两本词典?
最佳答案
字典的==
运算符要求键和值
类型符合Equatable
。
您已经为==
实现了一个(受限的)SortedList<Element>
运算符。
但是为类型实现==
运算符并不能使该类型Equatable
自动。必须明确声明一致性。
不幸的是,只有当SortedList<Element>
是Equatable
。数组存在同样的问题,比较
Why can't I make Array conform to Equatable?进行讨论
在苹果开发者论坛上。
据我所知,唯一的解决办法是
无条件地符合Element
(如Cristik's answer),或定义
字典的自定义比较运算符
func ==<Key : Equatable, T : Equatable>(lhs: [Key : SortedList<T>], rhs: [Key : SortedList<T>]) -> Bool {
// ...
}