0

我有以下最佳尝试:

extension Equatable where Self: Sequence, Self.Element: Equatable {
    public static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.elementsEqual(rhs)
    }
}

但这似乎不起作用。此外,它要求两个序列具有相同的确切类型,而我只想限制它们的Element类型相同。有没有办法做到这一点?

4

1 回答 1

2

协议从不符合其他协议。协议可能需要其他协议(我们通常称之为“协议继承”),但这并不能使协议符合其他协议。协议甚至不符合自己,更不用说别的了。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 可能是==,但不是~=,因此您需要选择您要使用的工具。

于 2019-03-18T23:37:57.720 回答