一.什么是NSClassFromString()
NSClassFromString()和NSStringFromClass()是一对互逆的方法。
看一下官方文档的声明
public func NSStringFromClass(_aClass:Swift.AnyClass) ->String
public func NSClassFromString(_aClassName:String) ->Swift.AnyClass?
NSClassFromString()是通过字符串的名称来创建类,
NSStringFromClass()是通过类的名称获取字符串。
主要看NSClassFromString()方法,可以看到返回值为“ Swift.AnyClass?”
首先可以看到返回值是一个可选型,当类不存在时会返回nil。
其次返回值是任意类,在使用过程中一般需要用as?转化为指定类。
二.NSClassFromString()的作用
作用主要分为两点:
1.动态创建类的对象,主要应用于反射设计中。
2.创建类时避免了类不存在程序崩溃的情况。
下面通过代码看一下如何通过这个方法创建类:
首先先写一个方法通过传递进来的参数创建类
private func controller(dict:[String:String]) -> UIViewController {
guard let clsName = dict["clsName"],
let title = dict["title"],
let imageName = dict["imageName"],
let cls =NSClassFromString(Bundle.main.namespace+"."+ clsName)as?UIViewController.Type
else{
return UIViewController()
}
let vc = cls.init()
vc.title= title
let nav =YCNavigationController(rootViewController: vc)
return nav
}
然后写一个方法调用controller方法
private func setupChildControllers(){
let array = [
["clsName":"YCHomeViewController","title":"首页","imageName":"image"],
["clsName":"YCMessageViewController","title":"消息","imageName":"image"],
["clsName":"YCDiscoverViewController","title":"发现","imageName":"image"],
["clsName":"YCProfileViewController","title":"我的","imageName":"image"]
]
var arrayM = [UIViewController]()
for dict in array{
arrayM.append(controller(dict: dict))
}
viewControllers= arrayM
}
最后在viewDidLoad中调用setupChildControllers()方法
override func viewDidLoad() {
super.viewDidLoad()
setupChildControllers()
}
至此就可以创建出四个对象。