无法使用类型为“”的参数列表调用“ *”-Swift Generics问题

时间:2019-02-27 09:09:26

标签: ios swift generics protocols

我有一个通用方法,该方法接受UITableviewCells数组来注册tableView。当我尝试注册时,出现以下错误

不能使用类型为((nibs:[UITableViewCell.Type]))'的参数列表调用'register'

我要注册的所有UITableviewCells都符合名为ReusableCell的协议

协议如下:

 protocol ReusableCell: class { static var identifier: String { get }}

 extension ReusableCell where Self: UIView {
        static var identifier: String {
            return String(describing: self)
        }
    }

通用方法如下:

extension UITableView {
func register<T: UITableViewCell>(nibs: [T.Type]) where T: ReusableCell {
        nibs.forEach { register($0.self, cellName: $0.identifier) }
    }
}

我的实现方式如下:

class CellOne: UITableViewCell, ReusableCell {}

class CellTwo: UITableViewCell, ReusableCell {}

tableView.register(nibs: [CellOne.self, CellTwo.self])
  • 上面的这一行会弹出错误'无法调用'注册',其类型为'(nibs:[UITableViewCell.Type])''的参数列表

---已编辑---

但是如果两个单元格属于同一类,则相同的函数不会引发任何错误

tableView.register(nibs: [CellOne.self, CellOne.self])

我在这里想念什么?任何帮助将不胜感激

谢谢。

1 个答案:

答案 0 :(得分:4)

您不需要泛型。您可以只使用ReusableCell.Type。您也不需要$0.self,因为$0已经是Type

extension UITableView {
    func register(nibs: [ReusableCell.Type])  {
        nibs.forEach { self.register($0, forCellReuseIdentifier: $0.identifier) }
    }
}

class CellOne: UITableViewCell, ReusableCell {}

class CellTwo: UITableViewCell, ReusableCell {}

let tableView = UITableView()

tableView.register(nibs: [CellOne.self, CellTwo.self])