如何根据Swift中的String创建对象?

这是我想要重构的代码:

let myCell = MyCustomTableViewCell() self.createCell(myCell, reuseIdentifierString: "myCellIdentifier") 

MyCustomTableViewCell符合SetCell协议,因此工作正常。 并且SetCell协议不是@obj_c协议。 这是一个迅速的协议

 private func createCell(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 

//埃德温:很奇怪,这是在文档中。 看起来好像这个……

你可以定义一个符合这样协议的变量:

 @objc protocol SetCell { func setcell() {} } let cellClass: AnyClass! = NSClassFromString("MyCell") var objectType : NSObject.Type! = cellClass as NSObject.Type! var myCell2:protocol = objectType() as protocol 
 class IndexViewController: UIViewController{} let className = "IndexViewController" let bundlePath = NSBundle.mainBundle().bundlePath let bundleFullName = bundlePath.componentsSeparatedByString("/").last let bundleName = bundleFullName?.componentsSeparatedByString(".").first let clazz = NSClassFromString(bundleName! + "." + className)! as! UIViewController.Type let object = clazz.init() // let object1 = Index()