斯威夫特:反射感谢infoDictionary
问题描述:
我尝试从一个字符串类名实例化一个新的类,就像我们可以用Java做方便。一旦斯威夫特:反射感谢infoDictionary
func stringClassFromString(_ className: String) -> AnyClass! {
let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
let cls: AnyClass = NSClassFromString("\(namespace).\(className)")!;
return cls;
}
由于一些google搜索,但我想这个解决方案由于采用了单元测试:我终于写了这个功能
func test() {
let myclass = stringClassFromString("NSDate") as! NSDate.Type
let instance = myclass.init()
print(instance)
}
我有一个例外(线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子码=为0x0)),只要我的测试使用的线:让命名空间......我想看到infoDictionary的内容,他是空的。所以我的问题很简单,是因为单元测试环境,我的字典是空的?是否有任何方法或库(如android的robolectric)来模拟infoDicionary以进行测试。
答
我成功找到我的错误,而不是使用主包,我用的是包类的构造函数来构建一个包,这将对应于当前环境:
let namespace = Bundle(for: type(of: self)).infoDictionary!["CFBundleExecutable"] as! String;
而且tadda,它的工作!
为什么你想从一个String类名实例化一个类?一个斯威夫特最大的优点是它的静态类型检查,当你尝试做这样的东西,从动态的标识符创建类,你完全跳过。此外,尽量使用本地斯威夫特类时,可用来代替那些基金会(如'Date'取代'NSDate')。 –
我学的飞速发展和思考,我认为可以是一个有趣的学习。感谢您的建议,我尽量避免使用Foundation类,但这里仅仅是一个例子。 – zed13
如果您正处于Swift学习的早期阶段,请不要反思。首先了解类型系统的基础知识,如果发现在充分利用静态类型检查器时无法解决的问题,请再次查看反射。 –