【问题标题】:Make an extensions of generic class in Swift4在 Swift4 中扩展泛型类
【发布时间】:2018-01-22 16:55:58
【问题描述】:

假设我们有一个简单的泛型类:

class Foo<T> {

}

接下来在这个类中添加一个实现UITableViewDatasoureextension

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 我已经玩了一段时间,并尝试了许多不同的方法来解决这个错误,但没有达到我们在这里寻找的通用解决方案。

标签: ios swift generics


【解决方案1】:

错误信息看起来很清楚。这不受支持。您不能将 @objc 方法附加到扩展中的泛型类。您需要在类定义中定义这些方法,而不是扩展。 “为什么”是“编译器今天不支持它”。 (由于专业化可能很难支持,但真正的答案是“编译器做不到。”)

【讨论】:

    【解决方案2】:

    目前Xcode不支持将@objc方法附加到扩展中的泛型类,您可以通过在类定义中定义方法来修复它,如下:

    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 ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多