通过类名字符串创建类的实例对象,在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 即可!