我有以下最佳尝试:
333
但是它似乎不起作用。此外,它要求两个序列具有相同的确切类型,而我只想约束它们的extension Equatable where Self: Sequence, Self.Element: Equatable {
public static func == (lhs: Self, rhs: Self) -> Bool {
return lhs.elementsEqual(rhs)
}
}
类型是相同的。有什么办法吗?
答案 0 :(得分:2)
协议从不遵守其他协议。协议可以需要其他协议(我们通常将其称为“协议继承”),但这并不会使协议符合其他协议。协议甚至都不符合自身,更不用说其他了。 Sequence.self
无法传递给需要Sequence.Type
的事物。
无论如何,Equatable要求被比较的事物属于同一类型。 “等于”的其他含义不等于。
如果要在“这两个序列具有相等的元素”之上构建方法,那很好。这就是elementsEqual
为您所做的。但这并不能使它们变得平等。
您尝试构建哪种算法来使用此算法,而elementEqual
尚未处理?
您可能正在寻找的只是某种语法糖,使其看起来像==
。完全没有问题。您可以构建要实现elementsEqual
的任何运算符。
infix operator ~=
func ~= <S1, S2>(lhs: S1, rhs: S2) -> Bool
where S1: Sequence, S2:Sequence,
S1.Element: Equatable, S1.Element == S2.Element
{
return lhs.elementsEqual(rhs)
}
我通常建议不要使用自定义运算符,但是如果您要进行大量此类工作,则显式的“这些序列具有相同顺序的相等值”运算符可能非常有用。您只是不想使用==
,因为那已经意味着某些事情,而这并不意味着。例如,两个集合可能是==
,而不是~=
,因此您需要选择您想要的工具。