基于非等同数据结构比较包含实际等同类型的字典
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
只有 Element
是 Equatable
。数组也存在同样的问题,对比一下
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 {
// ...
}
所以我想把两个相同类型的词典等同起来[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
只有 Element
是 Equatable
。数组也存在同样的问题,对比一下
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 {
// ...
}