所以我想把同一类型的两本词典等同起来。
[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

我得到以下错误:
swift - 根据不相等的数据结构比较包含实际等价类型的字典-LMLPHP
我假设编译器在抱怨,因为Equatable不符合SortedList,即使我已经实现了equatableEquatables的比较运算符(它可以使用,因为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 {
    // ...
}

10-08 09:20