Swift协议中的泛型

3

我正在尝试将访问者设计模式从我的(旧的)Java代码迁移到Swift。到目前为止,我有一个通用的先进先出队列(工作正常)。

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>)
}

我遇到了以下问题:

无法对非泛型类型“Visitor”进行特化

有什么提示吗?谢谢!


2
泛型和关联类型是两个不同的概念。 - vadian
感谢您的回答 - 我很乐意将两者都标记为有帮助。同时,感谢您提供的一般提示,说明泛型与关联类型(在Swift中)之间存在差异。 - Thomas
这个回答解决了你的问题吗?如何在Swift中创建通用协议? - pkamb
1
@RTXGamer:关于你的编辑:反引号是用于 代码,而非一般强调。"访问者模式" 或 "先进先出" 不是代码。 - Martin R
@pkamb:我找到了另一个相关问题,但我不确定如何将那个解决方案应用到两个协议的问题上。在另一篇文章中,where出现的部分对我来说并不是很清楚。 - Thomas
2个回答

3
您可以使 visit 方法通用:接受任何关联类型 T 为fifo类型 U 的访问者:
protocol FiFo {
    associatedtype U
    func enqueue(_ : U)
    func dequeue() -> U
    func visit<V: Visitor>(_ visitor : V) where V.T == U
}

3

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

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)
}

抱歉,我没有看到你的回答出现。现在我想知道我们的建议之间是否有区别或者它们是等价的。 - Martin R
3
@MartinR - 不用担心。关于泛型和关联类型之间的差异,它涉及到标准的同质性与异质性问题。例如,是否应该有多个接受 VisitorFiFo 方法,使用 where V.T == U 的多个方法不一定需要是相同类型,而关联类型可以强制要求这样做。如果只有一个泛型方法带有 Visitor,那么你的泛型模式更加简洁。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接