具有通用约束的TableView扩展

时间:2019-06-23 13:31:29

标签: swift generics

enter image description here获取无法将类型[UITableViewCell.type]的值转换为预期的参数类型[_.Type]。

下面是扩展名

extension UITableView {

 func registerCells<T>(ofTypes types:[T.Type]) where T:UITableViewCell {
    types.forEach { (type) in
        let nib = UINib(nibName: type.typeName, bundle: nil)
        self.register(nib, forCellReuseIdentifier: type.typeName)
    }
 }
}

protocol NameDescribable {
var typeName: String { get }
static var typeName: String { get }
}

extension NameDescribable {
  var typeName: String {
    return String(describing: type(of: self))
  }

 static var typeName: String {
    return String(describing: self)
 }
}

extension NSObject: NameDescribable {}
extension Array: NameDescribable {}

,调用语句为:

 mediaTable.registerCells(ofTypes: [AddCell.self,
                                       ImageMediaCell.self])

1 个答案:

答案 0 :(得分:1)

这是一个x-y问题。不需要泛型。无需协议。无需扩展。您需要的只是这个:

func registerCells(ofTypes types:[UITableViewCell.Type]) {
    for type in types {
        let typeName = String(describing:type.self)
        let nib = UINib(nibName: typeName, bundle: nil)
        self.register(nib, forCellReuseIdentifier: typeName)
    }
}

使用同义重用标识符将表视图单元子类注册到同名笔尖。