这是我想重构的代码:
let myCell = MyCustomTableViewCell()
self.createCell(myCell, reuseIdentifierString: "myCellIdentifier")
MyCustomTableViewCell符合SetCell协议,因此可以正常工作。并且SetCell协议不是@obj_c协议。这是一个快速的协议
private func createCell<T where T:SetCell>(classType: T, reuseIdentifierString: String) -> UITableViewCell {
var cell = _tableView.dequeueReusableCellWithIdentifier(reuseIdentifierString) as T
cell.setText()
return cell.getCustomCell()
}
现在,我重构代码,我想根据一个字符串创建myCell,但是该字符串与我的类名完全相同。我不想使用else-if或switch-case
let myCell: AnyClass! = NSClassFromString("MyCustomTableViewCell")
self.createCell(myCell, reuseIdentifierString: "myCellIdentifier")
但是现在,AnyClass的myCell不符合协议。我怎样才能做到这一点?
您需要的代码比这多一点。您将获得一个AnyClass而不是AnyObject。因此,您需要创建该类型的实例。您可以尝试以下方法:
let cellClass: AnyClass! = NSClassFromString("MyCell")
var objectType : NSObject.Type! = cellClass as NSObject.Type!
var theObject: NSObject! = objectType() as NSObject
var myCell:MyCell = theObject as MyCell
为了使其符合您的协议,您可以尝试以下几种方法:
1.您可以为所有符合协议的单元创建基类。并在上面的代码中使用它而不是UITableViewCell。为此,您可以使用如下代码:
protocol SetCell {
func setcell() {}
}
class BaseUITableViewCell : UITableViewCell, SetCell {
func setcell() {}
}
class MyCell : BaseUITableViewCell {
override func setcell() {}
}
let cellClass: AnyClass! = NSClassFromString("MyCell")
var objectType : NSObject.Type! = cellClass as NSObject.Type!
var theObject: NSObject! = objectType() as NSObject
var myCell:BaseUITableViewCell = theObject as BaseUITableViewCell
2.您可以使用扩展名来扩展UITableViewCell,就像添加一个空扩展名一样
extension UITableViewCell: SetCell {}
//编译时错误:
Declarations from extensions cannot be overridden yet
// Edwin:奇怪,在文档中。所以看起来这是出...
3.您可以定义一个符合以下协议的变量:
@objc protocol SetCell {
func setcell() {}
}
let cellClass: AnyClass! = NSClassFromString("MyCell")
var objectType : NSObject.Type! = cellClass as NSObject.Type!
var myCell2:protocol<SetCell> = objectType() as protocol<SetCell>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句