web-dev-qa-db-ja.com

Swift4でジェネリッククラスの拡張を作成する

単純なジェネリッククラスがあるとしましょう:

class Foo<T> {

}

次に、このクラスにextensionを実装するUITableViewDatasoureを追加します。

extension Foo: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //Code here
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //Code here
    }
}

この構造により、次のメッセージでコンパイラエラーが発生します。

@objcは、ジェネリッククラスまたはジェネリッククラスから継承するクラスの拡張内ではサポートされていません。非 '@objc'メソッド

'tableView(_:numberOfRowsInSection :)'は '@objc'プロトコル 'UITableViewDataSource'の要件を満たしていません

なぜだれか私に言うことができますか?そしてそれを修正するには?

14

エラーメッセージは非常に明確です。これはサポートされていません。拡張機能のジェネリッククラスに@objcメソッドをアタッチすることはできません。これらのメソッドは、拡張ではなくクラス定義で定義する必要があります。 「理由」は、「コンパイラが現在サポートしていない」ということです。 (特殊化のためにサポートするのは難しいかもしれませんが、実際の答えは「コンパイラーはそれを行うことができない」です。)

25
Rob Napier