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