如何在Swift中根据字符串创建对象?

阳光明媚

这是我想重构的代码:

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不符合协议。我怎样才能做到这一点?

埃德温·维米尔(Edwin Vermeer)

您需要的代码比这多一点。您将获得一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在php中创建字符串对象数组?

如何在Swift中从字符串创建类的实例

根据Javascript中的查询字符串创建嵌套对象

如何在对象数组中查找特定的字符串,在Swift中搜索每个对象?

根据字符串动态创建对象

如何在java中根据字符串日期对对象进行排序

如何在Excel VBA中创建字符串变量以根据变量名称循环?

如何根据json字符串创建对象,如下所示,它是Google翻译的api,以及如何在c#中反序列化它

Swift-如何从对象数组创建字符串数组

Swift-如何从具有String属性的对象数组中创建字符串?

如何在打字稿中创建可选的对象键字符串?

如何在Java中拆分字符串并创建json对象?

如何在TypeScript中从拆分字符串数组创建/合并对象?

如何在JavaScript中根据整数对字符串排序?

如何在Swift中从观察对象中提取字符串值

如何在Swift中创建15位长度的随机字符串?

如何从Java脚本中的字符串创建对象树

如何从JavaScript中的字符串创建日期对象

如何从数组中的子字符串创建arraylist对象

在 Raku 中,如何从字符串动态创建 Code 对象?

如何在Swift中限制字符串或属性字符串中的字符数

如何在字符串中显示每个对象

如何在Django QuerySet对象中拆分字符串

如何在JSON对象中添加URL字符串

如何在JS的对象文字中传递字符串?

如何在目标C中的字符串中打印字符串对象

如何在Excel中创建字符串文字?

如何在SwiftUI中创建字符串的大写版本?

如何在Java中创建字符串向量数组?