我有一个带有关联类型的 Swift 协议(protocol) 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 不符合任何一个协议(protocol)。然而,在从其中一个中删除函数后,我得到了一个更有趣的提示:“'FooMessageHandler' 要求类型 'BarMessage' 和 'FooMessage' 是等效的”。
在 C++ 中,X 有两个基数:MessageHandler<FooMessage>
和 MessageHandler<BarMessage>
.我如何在 Swift 中实现类似的功能?
最佳答案
消息类型遵循的协议(protocol)可以让您提供单一类型作为associatedtype
。
在您的 handle(message:)
中,您可以检查消息的类型并进行相应的处理。
protocol BazMessage {}
class FooMessage: BazMessage {}
class BarMessage: BazMessage {}
extension X: MessageHandler {
typealias Message = BazMessage
func handle(message: BazMessage) {}
}
关于swift - 符合通用协议(protocol)的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55577002/