斯威夫特:反射感谢infoDictionary

斯威夫特:反射感谢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以进行测试。

+1

为什么你想从一个String类名实例化一个类?一个斯威夫特最大的优点是它的静态类型检查,当你尝试做这样的东西,从动态的标识符创建类,你完全跳过。此外,尽量使用本地斯威夫特类时,可用来代替那些基金会(如'Date'取代'NSDate')。 –

+0

我学的飞速发展和思考,我认为可以是一个有趣的学习。感谢您的建议,我尽量避免使用Foundation类,但这里仅仅是一个例子。 – zed13

+2

如果您正处于Swift学习的早期阶段,请不要反思。首先了解类型系统的基础知识,如果发现在充分利用静态类型检查器时无法解决的问题,请再次查看反射。 –

我成功找到我的错误,而不是使用主包,我用的是包类的构造函数来构建一个包,这将对应于当前环境:

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

而且tadda,它的工作!