如何在Swift中从字符串实例化class和init?

如何在Swift中从字符串实例化class和init?,第1张

概述我可以在ObjC中从string中实例化类.例如,我通过子类化UITableViewCell定义了新的DBCell类,并使用以下代码从name实例化类: DBCell *cell=[tableView dequeueReusableCellWithIdentifier:cellClassname]; if (cell==nil) { Class cellClass=NSCl 我可以在ObjC中从string中实例化类.例如,我通过子类化UItableVIEwCell定义了新的Dbcell类,并使用以下代码从name实例化类:
Dbcell *cell=[tableVIEw dequeueReusableCellWithIDentifIEr:cellClassname];    if (cell==nil) {        Class cellClass=NSClassFromString(cellClassname);        cell=[cellClass alloc];        cell=[cell initWithStyle:cellStyle reuseIDentifIEr:cellClassname];    }

现在我需要将代码迁移到Swift,我在Swift中重新定义了Dbcell类:

class Dbcell: UItableVIEwCell {    var label:String?    var key:String?    var managedobject:NSManagedobject?    var delegate:AnyObject?    convenIEnce overrIDe init(style: UItableVIEwCellStyle,reuseIDentifIEr: String!) {        self.init(style: style,reuseIDentifIEr: reuseIDentifIEr)        self.textLabel.Font=UIFont.preferredFontForTextStyle(UIFontTextStyleCaption1)        self.backgroundcolor=UIcolor.blackcolor()        self.textLabel.backgroundcolor=UIcolor.blackcolor()    }    }

但是如何实例化类并调用相应的init函数呢?

Swift更加静态类型化,这使得它在运行时更加安全.例如,如果任何字符串都是错误的,你将崩溃(或者最好悄悄地做什么,这可能比崩溃更糟)并且编译器无法为你捕获它.

好的,但你如何处理这种模式?在Swift中,IMO的最佳方式是显式并创建映射.

let cellMapPing = [  "Dbcell": Dbcell.self,]if let cellClass = cellMapPing[cellClassname] {  let cell = cellClass(style: cellStyle,reuseIDentifIEr: cellClassname)  // use cell}

现在,当您重构并更改Dbcell的名称,但错过了Storyboard中的字符串时,一切都将按预期继续工作,而不是像在ObjC中那样崩溃或悄然失败.

Swift对这些映射也非常聪明.上面的cellMapPing类型是[String:Dbcell.Type],所以如果你有一个特殊的初始化Dbcell,它就可用了.但如果你的字典看起来像:

let cellMapPing = [  "Dbcell": Dbcell.self,"OtherCell": UItableVIEwCell.self]

那么类型是[String:UItableVIEwCell.Type]. Swift自动计算出涵盖所有值的最具体的类.如果你在这个列表中添加了一个没有实际使用的方法的类型,Swift可以在编译时捕获它.如果你犯了一个错误并添加了一些甚至不是表格视图的单元格:

let cellMapPing = [  "Dbcell": Dbcell.self,"OtherCell": UItableVIEwCell.self,"BadCell": UICollectionVIEwCell.self]

然后Swift会给你一个编译时警告,你已经创建了一个AnyObject.这对编写安全但灵活的代码非常好,所有这些都是为了字典的成本.

总结

以上是内存溢出为你收集整理的如何在Swift中从字符串实例化class和init?全部内容,希望文章能够帮你解决如何在Swift中从字符串实例化class和init?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存