web-dev-qa-db-ja.com

Swiftサブクラスのプロトコルメソッドをオーバーライドする

以下のプロトコルに準拠する拡張機能を実装する基本クラスがあります。

protocol OptionsDelegate {
    func handleSortAndFilter(opt: Options)
}

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

BaseViewControllerから継承するサブクラス「InspirationsViewController」を持っています。そして、私は拡張機能のプロトコルメソッドを以下のようにオーバーライドしています:

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

サブクラス拡張の "handleSortAndFilter"関数をオーバーライドするとエラーが発生します: "拡張のデクレレーションはまだオーバーライドできません"

しかし、UITableViewデータソースとデリゲートメソッドを実装しても、同様の問題は発生しません。

このエラーを回避する方法は?

13
Satyam

Where句でプロトコル拡張を使用します。できます。

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")
  }
}
18
Igor Bidiniuc

私の知る限り、拡張機能のメソッドをオーバーライドすることはできません。拡張機能でできることは次のとおりです。「Swift

  • 計算されたインスタンスプロパティと計算されたタイププロパティを追加する
  • インスタンスメソッドとタイプメソッドを定義する
  • 新しい初期化子を提供する
  • 下付き文字を定義する
  • 新しいネストされたタイプを定義して使用する
  • 既存の型をプロトコルに準拠させる」

抜粋:Apple Inc.「Swiftプログラミング言語(Swift 3.0.1)。」

3
Hossam Ghareeb