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,它正在工作!
我尝试从字符串 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,它正在工作!