swift - 符合通用协议(protocol)的多个实例

标签 swift protocols associated-types

我有一个带有关联类型的 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/

相关文章:

ios - 自定义 UIButton 触发 IBAction 一次,然后再也不会

swift - 从收藏 View 自动播放下一个音频文件

ios - 如何使用协议(protocol)关闭和显示自定义弹出窗口 (UIViewController) - SWIFT

rust - 是否可以组合嵌套关联类型的边界?

swift - 我如何使用类型(: someVar) as a proper Type in Swift?

Swift 和 ObjectMapper : NSDate with min value

ios - Swift 中的协议(protocol)设计

swift - 如果 Swift 协议(protocol)是用类型约束定义的,为什么不能直接访问该类型的属性/方法?

rust - 是否可以声明一个表示特征的关联类型?

arrays - 为什么 CSVImporter 不将数据作为数组导入?