[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 即可!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容