【问题标题】:Comparing dictionaries containing actually equatable types, based on non-equatable data structures基于非等价数据结构比较包含实际等价类型的字典
【发布时间】:2016-04-14 18:20:31
【问题描述】:

所以我想将两个相同类型的字典等同起来[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,即使我已经实现了相等Elements 的比较运算符(SortedList&lt;String&gt; 可以使用,如@987654341 @ 是等价的)。

如何比较这两个词典?

【问题讨论】:

  • 这与forums.developer.apple.com/thread/7172 中的问题相同:“为什么我不能使 Array 符合 Equatable?”。 – 你不能使SortedList&lt;Element&gt; 符合 Equatable 只有当 Element 是 Equatable。

标签: swift generics dictionary comparison equality


【解决方案1】:

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 更适合。

【讨论】:

  • SortedList 不能简单地变成Equatable,因为我无法比较元素,如果Element 不是Equatable。这就是问题的全部。
  • @MarcusRossel 也可以通过向 Element 添加类型约束来完成,我用这个更新了我的答案。
【解决方案2】:

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

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

不幸的是,(目前)不可能使 SortedList&lt;Element&gt; 符合 Equatable 仅当 ElementEquatable。数组也存在同样的问题,比较一下 Why can't I make Array conform to Equatable? 讨论 在 Apple 开发者论坛中。

据我所知,唯一的解决方案是制作SortedList&lt;Element&gt; 无条件地符合Equatable(如Cristik's answer),或定义 字典的自定义比较运算符

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2015-06-09
    • 1970-01-01
    • 2010-12-05
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多