如何根据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()