【问题标题】:Conforming to multiple instances of a generic protocol符合通用协议的多个实例
【发布时间】: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


    【解决方案1】:

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

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

    protocol BazMessage {}
    
    class FooMessage: BazMessage {}
    class BarMessage: BazMessage {}
    
    extension X: MessageHandler {
        typealias Message = BazMessage
        func handle(message: BazMessage) {}
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多