swift 协议中的泛型

generics in swift protocols

我正在尝试将访客模式从我的(旧)java 代码迁移到 swift。到目前为止,我有一个通用的 FIFO(工作正常)。

protocol FiFo {
    associatedtype U
    func enqueue(_ : U)
    func dequeue() -> U
}

我还想告诉 FIFO 实例只接受与 FIFO 实例使用相同类型的泛型的访问者实例。

protocol Visitor {
    associatedtype T
    func processValue(_ value : T)
}
protocol FiFo {
    associatedtype U
    func enqueue(_ : U)
    func dequeue() -> U
    func visit(_ visitor : Visitor<U>)
}

我面对的是:

Cannot specialize non-generic type 'Visitor'

有什么提示吗?谢谢!

您可以向关联类型添加约束:

protocol Visitor {
    associatedtype T
    func processValue(_ value : T)
}

protocol FiFo {
    associatedtype U
    associatedtype V: Visitor where V.T == U
    func enqueue(_ : U)
    func dequeue() -> U
    func visit(_ visitor: V)
}

您可以使 visit 方法通用:接受其关联类型 T 是 fifo 类型 U:

的任何访问者
protocol FiFo {
    associatedtype U
    func enqueue(_ : U)
    func dequeue() -> U
    func visit<V: Visitor>(_ visitor : V) where V.T == U
}