swift通过字符串获取类型实例化对象问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013976172/article/details/69383878

相信大家都碰到过轮播图跳转问题,公司需求变来变去,一会儿要跳网页一会儿要跳原生界面,跳网页不需要太多解释,跳原生事情就比较多了,我们公司就是这么蛋疼,但是需求下来了也没办法。之前解决方法都比较傻,基本就是写死那样固定跳哪几个原生界面,但是需求一直再变,程序也就自然要变。

于是和后台商量,直接传ios的控制器名称和安卓的活动名称来指定跳转哪个界面。基本上的意思就是通过后台传来的字符串转化成控制器类型再实例化之后跳转。于是上网搜索通过字符串获取类型等,有用的信息获取了一些,但是还是碰到一些坑与大家分享一下!

相信搜索过这类问题的朋友都知道NSClassFromString这个方法,通过字符串获取类型,我也看过几片博客介绍,基本都是通过如下方法

let namespace =Bundle.main.infoDictionary!["CFBundleExecutable"]as! String

        let clsName = namespace+ "."+ "UIViewController"

        let cls =NSClassFromString(clsName)as! UIViewController.Type

        let vc = cls.init()


在下已翻译成swift3.0的写法,当时我也是这样跟着写,namespace用来干啥的也不知道,但是发现直接崩溃了,cls是nil的。然后又试着去掉namespace发现又成功了,心里其实默默喷了

句什么烂博客,然后就开始用自己项目自定义的控制器,结果一运行妥妥的崩溃了。过程纠结了几次,最终是把namespace又给加上了,然后就成功了,于是满怀好奇的打印了一下namespace

,发现其实是项目名称,然后恍然大悟,因为自定义的控制器肯定是在自己的项目里的嘛,所以需要加上namespace命名空间,但是UIViewController是UIKit框架里的嘛,这样一想没毛病

,其实后来还试过把UIViewController换成String,不加命名空间的情况下也是行不通,当时更加纳闷了,难道之前的假设不成立?后来也是仔细一想,String是swift的类,但是NSClas

sFromString是NS开头的,是OC里的类,然后换成了NSString试了一下,恩,没毛病的。在下总结也是比较口语,希望有大神可以出来比较权威的解释一下!

展开阅读全文

没有更多推荐了,返回首页