Objective-C与Swift中通过字符串获取类的方法对比与实现

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)


通过上述方法可以对比发现在SwiftObjective-C中,通过字符串动态创建类的方法非常便捷。

而且修改起来非常方便,可以直接修改字符串来改变控制器类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值