首页 > 解决方案 > 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东西就应该有效,对吧?或者我错过了什么?

您能否指出实现此类目标的正确方法是什么?

标签: swiftgenericsconstraintsprotocols

解决方案


这是因为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
  }
}

推荐阅读