Reputation: 4994
Lets assume we have a simple generic class:
class Foo<T> {
}
next add to this class an extension
which implements UITableViewDatasoure
:
extension Foo: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//Code here
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//Code here
}
}
This construction causes a compiler error with message:
@objc is not supported within extensions of generic classes or classes that inherit from generic classes Non-'@objc' method
'tableView(_:numberOfRowsInSection:)' does not satisfy requirement of '@objc' protocol 'UITableViewDataSource'
Anyone can tell me why? And how to fix that?
Upvotes: 20
Views: 10908
Reputation: 111
Currently the Xcode doesn't support attach an @objc
method to a generic class in an extension, you can fix it by define the method inside the class definition, as following:
class Foo<T>: UIViewController, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//Code here ...
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//Code here ...
}
}
Upvotes: 2
Reputation: 299345
The error message seems very clear. This isn't supported. You can't attach an @objc
method to a generic class in an extension. You need to define these methods in the class definition, not an extension. The "why" is "the compiler doesn't support it today." (It's likely hard to support because of specializations, but the real answer is "the compiler can't do it.")
Upvotes: 44