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

标签 swift generics dictionary comparison equality

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

我收到以下错误:

Error

我假设编译器在提示,因为 SortedList不符合 Equatable ,即使我已经为 equatable Element 实现了比较运算符s(SortedList<String> 可以使用,因为 String 是等价的)。

如何比较这两个词典?

最佳答案

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

您已实现(受限)== SortedList<Element> 的运算符. 但是实现 ==类型的运算符不构成该类型 Equatable自动地。必须明确声明一致性。

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

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

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

关于swift - 基于非等同数据结构比较包含实际等同类型的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704632/

相关文章:

python - OrderedDictionary.popitem() 无法迭代所有值?

arrays - 在 VBA 中使用字典将行与 Sum 和 Max/Min 合并到某些列

Swift:在字符串文字中提供默认值

swift - 将新页面添加到 PageViewController

ios - SwiftUI - 如何将 EnvironmentObject 传递给 View 模型?

arrays - 尝试用 Argo 解码数组

generics - .NET 4.0 中协方差和逆变的一个很好的实际应用?

ios - 如何将数据添加到 CollectionView 中,仅用于数组 Swift 中的新附加索引

C# 通用复制构造函数

python - 将项目添加到列表字典