Swift实现NSClassFromString

在OC中NSClassFromString这个方法非常实用,基于这个方法可以实现动态生成对象,十分灵活。

1
2
3
//此方法声明在NSObjCRuntime.h
//显然是利用ObjC的runtime机制实现的
Class __nullable NSClassFromString(NSString *aClassName);

然而在Swift中却没有这样的方法(废话,Swift的runtime和ObjC完全不一样嘛),如果Swift也通过ObjC那样的runtime机制来实现,效率就会有明显的折扣了。
不过Swift实在太强大,可以利于语言本身的技巧,可以做到类似的事情:

1
2
3
let className: String = "SampleViewController"
let classes: Dictionary<String, ()->UIViewController> = [className : { return SampleViewController() }]
let viewController = classes[className]!()

利用Swift中的泛型机制、闭包语法,把NSClassFromString问题转化成了Dictionary的依据key查Value问题,非常巧妙地实现了通过String生成对象的机制。
略显麻烦的是,需要支持这个机制的类,都要先把对应的闭包写到Dictionary中。同时要注意,classes[className]返回的是一个optional类型,所以需要!解包,然后通过()调用闭包。