场景描述: 有多个按钮 ,每个按钮点击后都跳转到不同的控制器,一个一个去判断很繁琐,所以 将控制器的名字 以字符串的形式存到plist文件中 ,读取plist文件就可以获得对应控制器的字符串,问题是,如何通过一个字符串去初始化一个对象
一.系统自带类型的字符串
/**
将字符串 "UIViewController" 初始化为一个对象
*/
private func demo1(){
let string = "UIViewController"
let type = NSClassFromString(string) as! UIViewController.Type
let instance = type.init()
}
1.将字符串转换为类的方法 NSClassFromString 返回的类型是AnyClass
2.AnyClass的类型 实际上是 AnyObject.Type
3.将AnyClass 转换为你想转换的控制器.Type
比如 想转成UIViewController的类型
或者想转成UINavigationController的类型
二.自定义类型的字符串
先自定义一个类
class GXViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
// Do any additional setup after loading the view.
}
private func setupUI(){
view.backgroundColor = UIColor.whiteColor()
}
}
如果按照跟系统自带类型的字符串初始化对象的思路写出如下代码
private func demo2(){
let string = "GXViewController"
let type = NSClassFromString(string) as! UIViewController.Type
let instance = type.init()
}
fatal error: unexpectedly found nil while unwrapping an Optional value
也就是说 "GXViewController"这个字符串无法转换为一个类,所以我们就要考虑,这个类对应的字符串到底是什么,
let string = NSStringFromClass(GXViewController)
print(string)
initObject.GXViewController
也就是说这个自定义的类对应的字符串是 “项目名.类名”
所以我们应该这样将自定义的类的字符串 初始化为对象
private func demo2(){
let string = "initObject.GXViewController"
let type = NSClassFromString(string) as! UIViewController.Type
let instance = type.init()
}