基于非等同数据结构比较包含实际等同类型的字典

Comparing dictionaries containing actually equatable types, based on non-equatable data structures

所以我想把两个相同类型的词典等同起来[AnyLanguage: SortedList<String>]
AnyLanguage 符合 Hashable,因此也符合 Equatable,所以这不是问题。另一方面,SortedList 不符合 Equatable,因为它在 Element 上是通用的,没有任何限制:

public struct SortedList<Element> { ... }

现在,我已经实现了 SortedList 的相等运算符,当它的 Elements 符合 Equatable:

public func ==<T: Equatable>(left: SortedList<T>, right: SortedList<T>) -> Bool

现在,比较上述两个词典时:

let dictA: [AnyLanguage: SortedList<String>] = [:]
let dictB: [AnyLanguage: SortedList<String>] = [:]

dictA == dictB

我收到以下错误:

我假设编译器在抱怨,因为 SortedList 不符合 Equatable,即使我已经为 equatable Element 实现了比较运算符(SortedList<String> 将能够使用,因为 String 是等价的)。

如何比较这两个词典?

SortedList不是Equatable,所以Dictionary不能比较元素。您需要声明为 Equatable,并在没有通用约束的情况下实现 ==。这将起作用:

public struct SortedList<Element>: Equatable { ... }

public func ==<T>(left: SortedList<T>, right: SortedList<T>) -> Bool

如果你想将你的 SortedList 限制为 Equatable 元素,你可以声明它只接受符合 Equatable

的东西
public struct SortedList<Element: Equatable>: Equatable

但是对于你的 SortedList 我认为 Comparable 更适合。

字典的 == 运算符要求 Key 和 Value 类型符合 Equatable

您已经为 SortedList<Element> 实现了一个(受限的)== 运算符。 但是为类型实现 == 运算符并不能使该类型成为 Equatable 自动。必须明确声明一致性。

不幸的是,(目前)不可能使 SortedList<Element> 符合 Equatable 只有 ElementEquatable。数组也存在同样的问题,对比一下 Why can't I make Array conform to Equatable? 进行讨论 在 Apple 开发者论坛中。

据我所知,唯一的解决办法是 SortedList<Element> 无条件地符合 Equatable(如 ),或定义 字典的自定义比较运算符

func ==<Key : Equatable, T : Equatable>(lhs: [Key : SortedList<T>], rhs: [Key : SortedList<T>]) -> Bool {
    // ...
}