【发布时间】:2018-01-22 16:55:58
【问题描述】:
假设我们有一个简单的泛型类:
class Foo<T> {
}
接下来在这个类中添加一个实现UITableViewDatasoure的extension:
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方法附加到扩展中的泛型类。您需要在类定义中定义这些方法,而不是扩展。 “为什么”是“编译器今天不支持它”。 (由于专业化可能很难支持,但真正的答案是“编译器做不到。”) -
你能提供一个更具体的例子来说明你想在哪里使用它吗?我一直在努力让您的示例按原样工作,但看起来您无法以任何方式解决此错误,目标设定如下。
-
Tnx @RobNapier。将
UITableViewDataSource的实现从扩展移动到类定义修复了编译器错误。还 tnx 进行解释。我会将其标记为已回答,这是有可能的。 -
@MarošBeťko 我有几个我想要这个的案例,通常是出于组织原因。我喜欢将协议实现移动到它们自己的扩展中;它更清楚地说明了哪些方法适用于扩展。我认为我个人没有遇到过这种情况,这是绝对必要的,尽管如果
Foo是在另一个模块(例如第三方框架)中定义的。 -
@RobNapier 我已经玩了一段时间,并尝试了许多不同的方法来解决这个错误,但没有达到我们在这里寻找的通用解决方案。