部分内容参考:
http://www.jianshu.com/p/f2503afff164
一、打印namespace
在任意一个控制器的viewDidLoad()方法中打印self,打印结果是:
如图,GSYswift 就是namespace,默认为项目名(我的已经更改过了,原因在后文)
二、查看namespace
任意行点击右键,勾选上选中的选项,即可看到
CFBundleName
三、修改namespace
当需要修改命名空间的时候,如图
四、为什么要修改?
这也是我写本文的主要原因:
命名空间不可以有横线!
我的项目名称中是中英文混写并且有
-
横线的,而这就导致通过guard let 保护的时候,每次都会进入return。后来经过试验,发现命名空间有问题,经过测试后发现不可以加横线,纯英文可以,纯中文可以,中英混写也可以(我的是xcode8.2,别的混写不知道可不可以,但尽可能别混写=。=),但就是加了横线,导致cls为空,就一直return了。
五、如何代码获取命名空间名称,并创建相应的类
// 从info.plist读取namespace
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
// 拼接类名的完整格式,即namespace.类名,vcName即控制器的类名
let clsName = namespace + "." + vcName
let cls: AnyClass = NSClassFromString(clsName)!
// 得到相应的控制器
let vc = cls.alloc() as! UITableViewController