Objective-C与Swift中通过字符串获取类的方法对比与实现
根据条件判断生成控制器的时候,我们通常使用构造函数方法可以实现类的实例化,但是每次都这样写代码比较冗余,而且修改起来也比较麻烦。
普通写法:
UIViewController *vc = [[UIViewController alloc] init];
BOOL isLogin = YES;
// 通过登陆属性进行判断
if (isLogin) {
vc = [[LoginViewController alloc] init];
} else {
vc = [[OAuthViewController alloc] init];
}
[self presentViewController:vc animated:YES completion:nil];
因为,我们可以通过字符串动态生成类的方式来优化上述代码,在Swift和Objective-C中稍微有点区别,以一段小的代码demo来进行演示。
Objective-C中利用字符串来生成对应的类,动态获取类
NSString *vcName = [NSString string];
BOOL isLogin = YES;
// 通过登陆属性进行判断
if (isLogin) {
vcName = @"LoginViewController";
} else {
vcName = @"OAuthViewController";
}
// 通过NSClassFromString()方法来生成类
Class cls = NSClassFromString(vcName);
UIViewController *vc = [[cls alloc] init];
[self presentViewController:vc animated:YES completion:nil];
而Swift与Objective-C存在的区别除了语法之外,还有就是必须要有命名空间
Swift中的使用字符串+命名空间+动态获取类
// 如果用户登录,显示发布微博界面,否则,显示登录界面
var vcName: String
let isLogin: Bool = true
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
if isLogin {
vcName = "ComposeViewController"
} else {
vcName = "OAuthViewController"
}
// 以下两行代码是在 Swift 中使用字符串创建类的标准写法!
// 在 Swift 的 class 需要包含命名空间
let cls = NSClassFromString(namespace + "." + vcName) as! UIViewController.Type
let vc = cls.init()
presentViewController(vc, animated: true, completion: nil)
通过上述方法可以对比发现在Swift和Objective-C中,通过字符串动态创建类的方法非常便捷。
而且修改起来非常方便,可以直接修改字符串来改变控制器类型。