如何获得序列以实现Equatable?

时间:2019-03-18 23:24:17

标签: swift sequence equatable

我有以下最佳尝试:

333

但是它似乎不起作用。此外,它要求两个序列具有相同的确切类型,而我只想约束它们的extension Equatable where Self: Sequence, Self.Element: Equatable { public static func == (lhs: Self, rhs: Self) -> Bool { return lhs.elementsEqual(rhs) } } 类型是相同的。有什么办法吗?

1 个答案:

答案 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)
}

我通常建议不要使用自定义运算符,但是如果您要进行大量此类工作,则显式的“这些序列具有相同顺序的相等值”运算符可能非常有用。您只是不想使用==,因为那已经意味着某些事情,而这并不意味着。例如,两个集合可能是==,而不是~=,因此您需要选择您想要的工具。