単純なジェネリッククラスがあるとしましょう:
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'の要件を満たしていません
なぜだれか私に言うことができますか?そしてそれを修正するには?
エラーメッセージは非常に明確です。これはサポートされていません。拡張機能のジェネリッククラスに@objc
メソッドをアタッチすることはできません。これらのメソッドは、拡張ではなくクラス定義で定義する必要があります。 「理由」は、「コンパイラが現在サポートしていない」ということです。 (特殊化のためにサポートするのは難しいかもしれませんが、実際の答えは「コンパイラーはそれを行うことができない」です。)