Swift:感谢infoDictionary的反思

时间:2017-09-01 13:12:19

标签: unit-testing reflection swift3 resourcedictionary

我尝试从字符串类名称实现一个新类,就像我们在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用于测试目的。

1 个答案:

答案 0 :(得分:0)

我成功找到了我的错误,而不是使用主Bundle,我使用Bundle类的构造函数来构建一个对应于当前上下文的Bundle:

let namespace = Bundle(for: type(of: self)).infoDictionary!["CFBundleExecutable"] as! String;

tadda,它正在工作!