Реализация метода протокола в базовом классе, в то время как подклассы реализуют другие методы протокола, дают ошибку «избыточного соответствия» - PullRequest
0 голосов
/ 06 марта 2019

У меня есть три NSViewControllers, которые соответствуют NSOutlineViewDelegate, и реализуют те же методы протокола (делегата)

extension MyViewController1: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) {}
  func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {}
}

extension MyViewController2: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) {}
  func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {}
}

extension MyViewController3: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) {}
  func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {}
}

Но все 3 из них имеют одинаковую реализацию для

func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) {}

Таким образом, идея состояла в том, чтобы создать базовый класс BaseViewController, а затем он также должен соответствовать NSOutlineViewDelegate

extension BaseViewController: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) {}
}

Затем заставить каждый ViewController наследовать от базы

class MyViewController1: BaseViewController {}

но поскольку каждый ViewController имеет свою реализацию для другой сигнатуры, -viewFor, им все равно нужно будет соответствовать NSOutlineViewDelegate

extension MyViewController1: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {}
}

extension MyViewController2: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {}
}

extension MyViewController3: NSOutlineViewDelegate {
  func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {}
}

Но выполнение этого даетошибка:

Избыточное соответствие 'MyViewController1' протоколу 'NSOutlineViewDelegate'

Есть ли способ сделать то, что я пытаюсь сделать, и сделать компилятор счастливым?

...