我有一个Swift协议MessageHandler,具有关联的类型,几种不同的Message类型以及一个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中实现类似的目标?
答案 0 :(得分:1)
一种符合消息类型的协议,可以使您提供一种单一类型作为associatedtype
。
然后您可以在handle(message:)
内部检查消息的类型并进行相应的处理。
protocol BazMessage {}
class FooMessage: BazMessage {}
class BarMessage: BazMessage {}
extension X: MessageHandler {
typealias Message = BazMessage
func handle(message: BazMessage) {}
}