Swift:感谢 infoDictionary 的反思

Swift: reflection thanks to infoDictionary

我尝试从字符串 class 名称实例化一个新的 class,就像我们在 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))一旦我的测试使用该行:让命名空间...我试图看到infoDictionary的内容,他是空的。所以我的问题很简单,是不是因为单元测试上下文我的字典是空的?是否有任何方法或库(如 robolectric 用于 android)来模拟 infoDicionary 以进行测试。

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

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

还有 tadda,它正在工作!