我们都知道动态获取类使用 NSClassFromString
方法
但是在Swift中
1 2 |
let pim = NSClassFromString("PIMViewController") as! UIViewController.Type self.navigationController!.pushViewController(pim.init(), animated: true) |
直接使用会报错:unexpectedly found nil while unwrapping an Optional value
要在类名前加上module
名
Swift
虽然没有官方说明支持namespace
,但是有module
或者说target
来实现与namespace
相似的功能
Xcode中的每个构建目标(Target
)可以当做是一个模块(Module
),这个构建目标可以是一个Application
,也可以是一个通用的Framework
(更多的时候是一个Application
),target
名称与bundle
名称一致
1 2 3 |
var module = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String let pim = NSClassFromString(module + "." + "PIMViewController") as! UIViewController.Type self.navigationController!.pushViewController(pim.init(), animated: true) |
这样就ok了。
但是还有个操蛋的情况是,我们的bundle
name含有-符号的时候,还会报错。测试发现当target
名称包含-符号的时候,系统会自动转换为_,原名Sky-Swift
,转换为了Sky_Swift
那么代码中替换了就行。
1 2 3 4 |
var module = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String module = module.replacingOccurrences(of: "-", with: "_") let pim = NSClassFromString(module + "." + "PIMViewController") as! UIViewController.Type self.navigationController!.pushViewController(pim.init(), animated: true) |
Swift命名空间更多信息:http://www.cnblogs.com/kenshincui/p/4824810.html#nameSpace
转载请注明:天狐博客 » Swift NSClassFromString Crash