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