怎么通过一个字符串初始化一个对象

场景描述: 有多个按钮 ,每个按钮点击后都跳转到不同的控制器,一个一个去判断很繁琐,所以 将控制器的名字 以字符串的形式存到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()
    }
  
}



将字符串"GXViewController"初始化为一个对象

如果按照跟系统自带类型的字符串初始化对象的思路写出如下代码

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)



输出结果是(ps:新建的项目的名称是“initObject”):

initObject.GXViewController

也就是说这个自定义的类对应的字符串是  “项目名.类名”

所以我们应该这样将自定义的类的字符串 初始化为对象

private func demo2(){
        
        let string = "initObject.GXViewController"
        
        let type = NSClassFromString(string) as! UIViewController.Type
        let instance = type.init()
  
    }



转载于:https://my.oschina.net/u/1476033/blog/604342

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值