[iOS] 根据类名字符串动态创建类的实例对象

通过类名字符串创建类的实例对象,在OC和Swift均可实现, 下面分别介绍其方法,以动态创建“ ViewController”为例

Objective-C 方法

OC中动态创建的方法比较简单:

NSString *name = @"ViewController";
Class cls = NSClassFromString(name);
UIViewController *vc = [[cls alloc] init];

Swift 方法

相比较而言,Swift中动态创建稍微复杂一些,主要是使用到了一个命名空间的概念,核心代码如下:

let str = "ViewController"
            
//1. 获取命名空间(CFBundleExecutable这个键对应的值就是项目名称,也就是命名空间)
guard let nameSpace = Bundle.main.infoDictionary?["CFBundleExecutable"] as? String else {
       print("获取命名空间失败")
       return
}
//2. 将字符串转化为类
 let name = nameSpace + "." + str
guard let cls = NSClassFromString(name) else {
       print("获取类失败")
       return
}
            
//3. 将anyClass转换为指定的类型
guard let vcCls = cls as? UIViewController.Type else {
      print("转换类型失败")
      return
}
//4. 通过class创建对象
 let vc = vcCls.init()

这里主要是利用名名空间来拼接类型字符串:
命名空间 + “.” + 类名字符串
本例中完整的字符串为:LQToolKit.ViewController

如果在上面第二步,即通过字符串创建类的时候为nil,则检查你的命名空间是否含有汉字及其非法字符(我在测试时因为含有 “-”而一直创建失败),最好修改为纯英文的。所谓命名空间,一般来说和你的项目名称相同,但也可以修改:
TARGETS -> Build Settings -> 搜索“product name”
即可修改当前项目的命名空间:

可以看到,原先我的项目名称为LQToolKit-Swift,因为含有“-”,一直创建失败,改为 LQToolKit 即可!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 纵使坚持很累,但心怀感恩欣喜,一路走来,开放日顺利度过,虽然给自己打60分及格,我知道要学的还有很多,日子很长,有...
    aifeng_8caf阅读 1,094评论 2 1
  • 最近几年,人贩子拐卖儿童经常发生,孩子被拐骗有时候防不胜防,朋友圈几乎每天都发,小孩被抱走的事情,我现在也当妈妈了...
    东北SK皇家成长中心阅读 2,481评论 0 0
  • 文:丑石 憋屈的秸秆 终于 在昨夜点燃 一串串火龙 田野间 肆虐 扯起滚滚狼烟 城市 笼罩雾霾 刺鼻的味道 钻进...
    丑石123阅读 1,328评论 0 0
  • 今天的户外游戏中,Ida请愿意上前示范青蛙跳的小朋友上前,楷楷马上就上前要给小朋友做示范,并且示范的很好,也很大方...
    ic班阅读 2,720评论 0 0

友情链接更多精彩内容