Swift override protocol methods in sub classes

Satyam picture Satyam · Dec 27, 2016 · Viewed 11.1k times · Source

I've a base class that implements an extension that conforms to a protocol as below:

protocol OptionsDelegate {
    func handleSortAndFilter(opt: Options)
}

extension BaseViewController: OptionsDelegate {
    func handleSortAndFilter(opt: Options) {
        print("Base class implementation")
    }
}

I've a subclass "InspirationsViewController" that inherits from BaseViewController. And I'm overriding protocol method in the extension as below:

extension InspirationsViewController {
    override func handleSortAndFilter(opt: Options) {
        print("Inside inspirations")
    }
}

I'm getting error when I override "handleSortAndFilter" function in subclass extension: "Declerations in extensions cannot override yet"

But I'm not seeing similar problem when I implemented UITableView datasource and delegate methods.

How to avoid this error?

Answer

Igor Bidiniuc picture Igor Bidiniuc · Dec 27, 2016

Use protocol extension with where clause. It works. But I would not recommend you to have such things in your codebase.

class BaseViewController: UIViewController {

}

extension OptionsDelegate where Self: BaseViewController {
  func handleSortAndFilter(opt: Options) {
    print("Base class implementation")
  }
}

extension BaseViewController: OptionsDelegate {

}

class InsipartionsViewController: BaseViewController {

}

extension OptionsDelegate where Self: InsipartionsViewController {
  func handleSortAndFilter(opt: Options) {
    print("Inspirations class implementation")
  }
}