所以我想把两个相同类型的词典等同起来[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
实现了比较运算符s(SortedList<String>
可以使用,因为 String
是等价的)。
如何比较这两个词典?
最佳答案
==
字典运算符要求 Key 和 Value
类型符合 Equatable
.
您已实现(受限)==
SortedList<Element>
的运算符.
但是实现 ==
类型的运算符不构成该类型
Equatable
自动地。必须明确声明一致性。
不幸的是,(目前)不可能制作SortedList<Element>
符合 Equatable
仅当 Element
是Equatable
.数组也存在同样的问题,对比一下
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/