Как я могу получить Sequence для реализации Equatable? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть лучшая попытка:

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

Но, похоже, она не работает.Кроме того, требуется, чтобы обе последовательности имели один и тот же точный тип, тогда как я хочу ограничить, чтобы их Element типы были одинаковыми.Есть ли способ сделать это?

1 Ответ

2 голосов
/ 19 марта 2019

Протоколы никогда не соответствуют другим протоколам. Протоколы могут требовать других протоколов (которые мы обычно называем «наследованием протоколов»), но это не делает протоколы соответствующими другим протоколам. Протоколы даже не соответствуют самим , не говоря уже о чем-то еще. 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)
}

Я обычно рекомендую против пользовательских операторов, но если вы выполняете большую часть такого рода работы, явный оператор «эти последовательности имеют одинаковые значения в одном и том же порядке» может быть очень полезным. Вы просто не хотели бы использовать ==, потому что это уже означает что-то, что это не значит. Например, два комплекта могут быть ==, но не ~=, поэтому вам нужно выбрать инструмент, который вы имеете в виду.

...