Swift 字符串转本类(类type)

源码 2024-9-12 14:55:03 64 0 来自 中国
字符串转类:通用AnyClass版在文末
在OC中,使用NSClassFromString("XXXTableViewCell")就可以轻松得到一个类实例。
在Swift中,假如直接使用这个方法却会得到nil。
作者想要达到的实现:在使用纯Model搭建组件的时间,步伐在底层框架构建Cell的时间只必要一个类名(String范例)就可以完成全部事变,而不必要把cell先初始化出来。


  • 字符串转类
/// 字符串转类typefunc cellClassFromString(_ className:String) -> AnyClass {    // 1、获swift中的定名空间名    var name = Bundle.main.object(forInfoDictionaryKey: "CFBundleExecutable") as? String    // 2、假如包名中有'-'横线这样的字符,在拿到包名后,还必要把包名的'-'转换成'_'下横线    name = name?.replacingOccurrences(of: "-", with: "_")    // 3、拼接定名空间和类名,”包名.类名“    let fullClassName = name! + "." + className    // 4、因为NSClassFromString()返回的AnyClass?,必要给个默认值返回!    let classType: AnyClass = NSClassFromString(fullClassName) ?? VEBTableViewCell.self    // 类type    return classType}在用cellClassFromString(_ className:String)得到类Type之后,既能使用classType.self 大概 classType.ClassForCorde() 来举行重用Cell的注册。
// 注册cell方法tableView.register(cellClassFromString("类名").self, forCellReuseIdentifier: "\("类名")!)")又能直接使用类Type来举行tableViewCell的初始化
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {        // 得到AnyClass    let anyClass: AnyClass = cellClassFromString(str)    // 强转自己必要的类,使用类方法 .cell来得到一个实例对象    let classType = anyClass as! VEBTableViewCell.Type    let cell = classType.cell(tableView)    return cell}

  • (通用)末了也可以把这个方法封装到String+内里,作为通用方法:
/// 字符串转类func classFromString(_ className:String) -> AnyClass? {    // 1、获swift中的定名空间名    var name = Bundle.main.object(forInfoDictionaryKey: "CFBundleExecutable") as? String    // 2、假如包名中有'-'横线这样的字符,在拿到包名后,还必要把包名的'-'转换成'_'下横线    name = name?.replacingOccurrences(of: "-", with: "_")    // 3、拼接定名空间和类名,”包名.类名“    let fullClassName = name! + "." + className    // 通过NSClassFromString获取到终极的类    let anyClass: AnyClass? = NSClassFromString(fullClassName)    // 本类type    return anyClass}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:20, Processed in 0.140721 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表