Swift - 具有通用父类(super class)约束的扩展中的协议(protocol)默认实现

标签 swift generics constraints protocols

我试图将协议(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/

相关文章:

elasticsearch - 如何检查Elasticsearch唯一文件

swift - RunLoop 与 DispatchQueue 作为调度器

ios - 从共享扩展中检索 imageURL

c# - 使用 LINQ 选择字典 <T1, T2>

c - 是否可以使用泛型函数将数组复制到 C 中另一个数组的不同类型

mysql - 在连接中独立地向两个表添加约束

ios - UIcollectionViewCell 中 UITableView 的动态高度

ios - 在 Xcode for iOS 应用程序中使用 Swift 绘制性能 UIGraphicsBeginImageContextWithOptions 比例因子

generics - 管道运算符(operator)拒绝工作

postgresql - 有没有办法在 postgresql 中捕获延迟约束的异常?