我试图将协议(protocol)扩展限制为通用类。我的目标是提供协议(protocol)的默认实现,其中 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
}
}
关于Swift - 具有通用父类(super class)约束的扩展中的协议(protocol)默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61301197/