我尝试从字符串类名称实现一个新类,就像我们在Java中可以轻松做到的那样。我终于写了这个函数:
func stringClassFromString(_ className: String) -> AnyClass! {
let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
let cls: AnyClass = NSClassFromString("\(namespace).\(className)")!;
return cls;
}
感谢一些谷歌搜索,但是一旦我通过单元测试尝试了这个解决方案:
func test() {
let myclass = stringClassFromString("NSDate") as! NSDate.Type
let instance = myclass.init()
print(instance)
}
我有一个例外(线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0))我的测试使用以下行:let namespace ...我试图查看infoDictionary的内容,他'空了。所以我的问题很简单,是因为单元测试上下文我的字典是空的吗?是否有任何方法或库(如android的robolectric)来模拟infoDicionary用于测试目的。
答案 0 :(得分:0)
我成功找到了我的错误,而不是使用主Bundle,我使用Bundle类的构造函数来构建一个对应于当前上下文的Bundle:
let namespace = Bundle(for: type(of: self)).infoDictionary!["CFBundleExecutable"] as! String;
tadda,它正在工作!