szu*_*rse 5 generics protocols ios conform swift
这是我想要重构的代码:
let myCell = MyCustomTableViewCell()
self.createCell(myCell, reuseIdentifierString: "myCellIdentifier")
Run Code Online (Sandbox Code Playgroud)
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()
}
Run Code Online (Sandbox Code Playgroud)
现在我重构我的代码,我想根据字符串创建myCell,但字符串与我的类名完全相同.我不想使用else-if或switch-case
let myCell: AnyClass! = NSClassFromString("MyCustomTableViewCell")
self.createCell(myCell, reuseIdentifierString: "myCellIdentifier")
Run Code Online (Sandbox Code Playgroud)
但现在,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
Run Code Online (Sandbox Code Playgroud)
为了让它符合您的协议,您可以尝试以下几点:
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
Run Code Online (Sandbox Code Playgroud)
2.您可以使用扩展程序扩展UITableViewCell,例如添加空扩展名
extension UITableViewCell: SetCell {}
Run Code Online (Sandbox Code Playgroud)
//编译时错误:
Declarations from extensions cannot be overridden yet
Run Code Online (Sandbox Code Playgroud)
//埃德温:很奇怪,这是在文档中.看起来好像这个......
你可以定义一个符合这样协议的变量:
@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>
Run Code Online (Sandbox Code Playgroud)