Ваше соответствие Equatable
является версией Objective-C, а не версией Swift.
protocol FoobarProtocol: Equatable {}
extension FoobarProtocol {
public static func == (lhs: Self, rhs: Self) -> Bool {
return true // do something useful
}
}
Ваш вопрос касается протоколов как Array
элементов с дополнительными соответствиями.Это приведет к другой ошибке:
ошибка: использование 'FoobarProtocol' в качестве конкретного типа, соответствующего протоколу 'Equatable', не поддерживается
Это потому, что Equatable
соответствие - это просто соответствие другому протоколу.Реализация по умолчанию static func == (lhs:rhs:)
может создать впечатление, что это полная реализация, но это не так. Это все еще соответствие, пока конкретный тип не адаптируется к этому протоколу. Реализация по умолчанию автоматически пробуждается, когда протокол используется в конкретной реализации.
Короче: Протокол в Swift не может быть равносильным.Только конкретный тип может быть уравновешенным.
Альтернативные варианты
- Создание типа бетона без наследования с использованием struct .
- Используйте наследование с классами вместо структур, чтобы вы могли иметь несколько конкретных реализаций
- Создать объект-оболочку , который имеетсвойство с типом протокола