Quantcast
Channel: 天狐博客
Viewing all articles
Browse latest Browse all 115

Swift NSClassFromString Crash

$
0
0

我们都知道动态获取类使用 NSClassFromString方法

但是在Swift中

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名称一致

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

069af321-6548-4aca-b6bb-b13af59a0f26

那么代码中替换了就行。

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


Viewing all articles
Browse latest Browse all 115

Trending Articles