符合通用协议的多个实例

时间:2019-04-08 15:35:17

标签: swift protocols associated-types

我有一个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中实现类似的目标?

1 个答案:

答案 0 :(得分:1)

一种符合消息类型的协议,可以使您提供一种单一类型作为associatedtype

然后您可以在handle(message:)内部检查消息的类型并进行相应的处理。

protocol BazMessage {}

class FooMessage: BazMessage {}
class BarMessage: BazMessage {}

extension X: MessageHandler {
    typealias Message = BazMessage
    func handle(message: BazMessage) {}
}