【发布时间】:2019-08-29 19:31:58
【问题描述】:
我有一个 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 中实现这样的目标?
【问题讨论】:
标签: swift protocols associated-types