У меня есть протокол Swift MessageHandler со связанным типом, несколькими различными типами сообщений, а также классом X:
protocol MessageHandler {
associatedtype Message
func handle(message: Message)
}
class FooMessage {}
class BarMessage {}
class X {}
Теперь, как мне сделать X способным обрабатывать как FooMessages, так и BarMessages?
Попытка:
extension X: MessageHandler {
typealias Message = FooMessage
func handle(message: FooMessage) {}
}
extension X: MessageHandler {
typealias Message = BarMessage
func handle(message: BarMessage) {}
}
просто выдает ошибку «избыточного соответствия».
Это:
protocol FooMessageHandler: MessageHandler where Message == FooMessage {}
protocol BarMessageHandler: MessageHandler where Message == BarMessage {}
extension X: FooMessageHandler {
func handle(message: FooMessage) {}
}
extension X: BarMessageHandler {
func handle(message: BarMessage) {}
}
заставляет компилятор сказать, что X не соответствует ни одному из протоколов.Однако после удаления функции из одного из них я получаю более интересную жалобу: «FooMessageHandler требует, чтобы типы« BarMessage »и« FooMessage »были эквивалентными».
В C ++ X будет иметь две базы: MessageHandler<FooMessage>
и MessageHandler<BarMessage>
.Как мне добиться чего-то подобного в Swift?