swift - Swift - 具有通用超类约束的扩展中的协议默认实现
问题描述
我正在尝试将协议扩展限制为泛型类。我的目标是提供一个协议的默认实现,其中 Self 是某个泛型类的子类的任何实例。考虑下面的例子:
protocol Printable {
var value: String { get }
}
class Printer<P: Printable> {
let printable: P
init(printable: P) {
self.printable = printable
}
}
protocol Press {
func print()
}
// error: reference to generic type 'Printer' requires arguments in <...>
extension Press where Self: Printer {
func print() {
// Do Something with self.printable.value
}
}
编译器给出错误error: reference to generic type 'Printer' requires arguments in <...>
。我不明白为什么不允许这样做。只要Press
某种东西Printer
总是适用于某种Printable
东西就应该有效,对吧?或者我错过了什么?
您能否指出实现此类目标的正确方法是什么?
解决方案
这是因为Printer<A>
和Printer<B>
是不同的类型,甚至 A & B 都是可打印的,所以由于可能的歧义编译器会产生错误。
您需要以下内容(使用 Xcode 11.4 测试)
extension Press {
func print<P>() where Self: Printer<P>, P: Printable {
// Do Something with self.printable.value
}
}
推荐阅读
- kubernetes - 如何使用 Kubernetes Kustomize 避免不为空的命名空间删除
- c++ - 臂内联组件的无效符号重新定义
- python - 投资组合优化 - 无法检索“x”的属性
- google-apps-script - 为什么我在 Apps 脚本中获得与当前活动部署不同的 URL?
- html - 为什么附加文本的字体系列在可编辑的 div 中会发生变化?
- r - 如何对某组受访者运行线性模型?
- powerbi - 访问 Power BI 报告的问题。用户身份不同
- javascript - bundle.js 和 bundle.js.map 在组件重新渲染时不断重复
- sql - 如何使用 group by 按条件获取一行?
- python - 当我在同一个文件夹中没有忽略图像时,为什么我的一些图像在 Tensorflow 中被忽略?