Swift - 具有通用超类约束的扩展中的协议默认实现
Swift - Protocol default implementation in extension with generic superclass constraint
我正在尝试将协议扩展限制为通用 class。我的目标是提供一个协议的默认实现,其中 Self 是某个通用 class 的子 class 的任何实例。考虑以下示例:
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
是某种总是与某种 Printable
一起工作的 Printer
就应该可以工作,对吧?或者我遗漏了什么?
你能指出实现这样的目标的正确方法是什么吗?
这是因为 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
}
}
我正在尝试将协议扩展限制为通用 class。我的目标是提供一个协议的默认实现,其中 Self 是某个通用 class 的子 class 的任何实例。考虑以下示例:
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
是某种总是与某种 Printable
一起工作的 Printer
就应该可以工作,对吧?或者我遗漏了什么?
你能指出实现这样的目标的正确方法是什么吗?
这是因为 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
}
}