前些天在搭建Swift项目框架时,为了提高项目的低耦合性,希望在不动代码的情况下,通过改变plist文件的键值对就可以改变项目的模块,使项目更灵活,便使用了NSClassFromString去协助搭建框架.
1.原先的核心代码是这样的
其中
className拼接后是项目中某个ViewController的类名
let className = viewControllerString + "ViewController"
let ViewControllerClass = NSClassFromString(className) as! SXViewController.Type
let vc = ViewControllerClass.init()
let nc = SXNavigationController(rootViewController:vc)
在执行这段代码后,会报以下错误
fatal error: unexpectedly found nil while unwrapping an Optinal value
2.在stackoverflow等网站查阅了一下资料后,得知,swift中在使用NSClassFromString,字符串转类型时,如果是自定义的类,需要加上项目名称才可以获取到.
修改后代码如下
其中YueChooseSwift是我项目名
let className = "YueChooseSwift." + viewControllerString + "ViewController"
let ViewControllerClass = NSClassFromString(className) as! SXViewController.Type
let vc = ViewControllerClass.init()
let nc = SXNavigationController(rootViewController:vc)
这时就成功运行了.
具体项目代码可以在github下载
https://github.com/Story5/WebCityPublicProject/tree/master/YueChoose/XcodeProject/YueChooseSwift