协议从不符合其他协议。协议可能需要其他协议(我们通常称之为“协议继承”),但这并不能使协议符合其他协议。协议甚至不符合自己,更不用说别的了。Sequence.self
不能传递给需要Sequence.Type
.
在任何情况下,Equatable 都要求被比较的事物是同一类型的。“相等”的其他含义不是 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)
}
我通常建议不要使用自定义运算符,但是如果您正在做很多此类工作,那么明确的“这些序列在相同的顺序中具有相同的值”运算符可能会非常有用。您只是不想使用==
,因为这已经意味着这并不意味着。例如,两个 Set 可能是==
,但不是~=
,因此您需要选择您要使用的工具。