【发布时间】:2021-02-14 12:01:48
【问题描述】:
我正在尝试将我的设计转换为pop。但是,我被卡住了,并且已经有一堆线程可以用于我的方法 - 虽然不是这个问题的重复 - 显然它们都是死胡同。
我的问题是,有没有办法覆盖从另一个协议继承的协议方法的参数类型?
struct Books: Codable {}
protocol Listener {
func listen(_ param: Codable)
}
protocol BooksListener: Listener {
func listen(_ param: Books)
}
class MyClass: BooksListener {
// I want only this one to required with the type.
func listen(_ param: Books) {
<#code#>
}
func listen(_ param: Codable) {
<#code#>
}
}
我进行了研究,我相信这不是协议的工作方式。我只是在寻求解决方案。
我尝试将associatedType 添加到Listener 并将其用作listen(_:) 中的类型。但是这个解决方案限制任何类必须符合从Listener 继承的多个协议。详情可见here
【问题讨论】:
-
"但显然不是最佳实践,因为类似的类和协议不共享任何祖先。"我不同意类似的类必须共享一个祖先。您可以过度干燥代码。抽象应该始终服务于一个目的。使事情变得非常复杂以消除少量清晰的代码对程序的伤害大于它的帮助。但是这里可能有一些价值,所以让我们探索一下。 :D
-
(另外,从头开始构建,我已经重新创建了你描述的每一个问题。其中一些无法用 Swift 表达。)
-
但是,如果您的意思是一个 API,您可以在其中调用
service.add(observer: self)并通过协议一致性以高度通用的方式处理它,不。斯威夫特无法表达。 -
另外,这正是我们现在可以使用 Combine 来解决的问题。 (我的 Observable 以及后来的实验如 gist.github.com/rnapier/981e86fbf345b049c1df41f63e4a2c6e 都是在 Combine 之前构建的。)
-
我目前用于生产 iOS 11 项目的化身在这里:gist.github.com/rnapier/4a397197a4c698d872301597668d964d
标签: swift swift-protocols protocol-oriented