部分內容參考:
http://www.lxweimin.com/p/f2503afff164
一、打印namespace
在任意一個控制器的viewDidLoad()方法中打印self,打印結果是:
GSYswift.png
如圖,GSYswift 就是namespace,默認為項目名(我的已經更改過了,原因在后文)
二、查看namespace
Info文件.png
任意行點擊右鍵,勾選上選中的選項,即可看到
CFBundleName
三、修改namespace
當需要修改命名空間的時候,如圖
修改namespace.png
四、為什么要修改?
這也是我寫本文的主要原因:
命名空間不可以有橫線!
示例.png
我的項目名稱中是中英文混寫并且有
-
橫線的,而這就導致通過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