
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不符合协议.
我怎样才能做到这一点?
let cellClass: AnyClass! = NSClassFromString("MyCell")var objectType : NSObject.Type! = cellClass as NSObject.Type!var theObject: NSObject! = objectType() as NSObjectvar 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 NSObjectvar myCell:BaseUItableVIEwCell = theObject as BaseUItableVIEwCell 2.您可以使用扩展名扩展UItableVIEwCell,例如添加空扩展名
extension UItableVIEwCell: SetCell {} //编译时错误:
Declarations from extensions cannot be overrIDden yet
//埃德温:很奇怪,这是在文档中.看起来好像这个……
你可以定义一个符合这样协议的变量:
@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> 总结 以上是内存溢出为你收集整理的ios – 如何根据Swift中的String创建对象?全部内容,希望文章能够帮你解决ios – 如何根据Swift中的String创建对象?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)