Swift - реализация протокола по умолчанию в расширении с общим ограничением суперкласса c - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь ограничить расширение протокола классом c. Моя цель - предоставить реализацию протокола по умолчанию, где Self - это любой экземпляр, который является подклассом некоторого обобщенного c класса. Рассмотрим приведенный ниже пример:

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, вещи должны работать, верно? Или я что-то упускаю?

Можете ли вы указать, что может быть правильным способом достижения чего-то подобного?

1 Ответ

2 голосов
/ 19 апреля 2020

Это потому, что 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
  }
}
...