博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射机制
阅读量:5143 次
发布时间:2019-06-13

本文共 2521 字,大约阅读时间需要 8 分钟。

在Swift中并不提倡使用Runtime,而是像其他语言一样使用反射(Reflect)。当然,目前Swift中的反射还没有其他语言中的反射功能强大,不仅远不及OC的Runtime,离Java的反射也有一定的距离。

Swift的反射机制是基于一个叫 Mirror 的 struct 来实现的

//反射事例

//反射机制,取出类的名字,转换成类,还要强转成类的类型               //1.从Bundle取出项目的名字(命名空间 = “项目的名字”+“.”+"类名")        //2.修改命名空间,TARGETS -> Build Setting -> 输入product name ->修改即可         print("\(Bundle.main.infoDictionary)")        let clsN = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""                //3.let class NSClassFromString(className) as? class.Type        //4. let cls = class?.init()        let clsName = clsN + ".ViewController"        let cls = NSClassFromString(clsName) as? ViewController.Type        let vc = cls?.init()        window?.rootViewController = vc//        let vc = ViewController()//        window?.rootViewController = vc        window?.makeKeyAndVisible()//2.//MARK:添加子控制器    //反射机制,将控制器的属性添加到字典数组中,然后再创建一个存储有控制器的数组A,遍历存储有控制器所有属性的数组,并调用返回控制器的方法,添加到数组A中,并把数组赋值给viewControllers //----反射控制器的方法    //根据命名空间+"."+"类名"反射出类    //再设置类的title,image,文字大小     //再创建导航将根控制器添加上去,返回导航    func setupChildViewController (){        let array = [["clsName":"SinaHomeViewController","title":"首页","imageName":"tabbar_home"],["clsName":"SinaHomeViewController","title":"信息","imageName":"tabbar_message_center"],             ["clsName":"","title":"","imageName":""],            ["clsName":"SinaHomeViewController","title":"发现","imageName":"tabbar_discover"],["clsName":"SinaHomeViewController","title":"我","imageName":"tabbar_profile"]]                var arrayVc = [UIViewController]()        for dict in array{            arrayVc.append(addViewController(dict: dict))        }        viewControllers = arrayVc    }       func addViewController(dict:[String:String])-> UIViewController{        //判断字典中是否有title,类名,imageName        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        vc.tabBarItem.image = UIImage(named: imageName)        vc.tabBarItem.selectedImage = UIImage(named: imageName + "_selected")?.withRenderingMode(.alwaysOriginal)        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.black], for: .normal)        let nav = SinaNavController(rootViewController: vc)        return nav    }

 

转载于:https://www.cnblogs.com/TheYouth/p/6435546.html

你可能感兴趣的文章
TCP的三次握手与四次挥手(详解+动图)
查看>>
(转)ListView——BaseAdapter
查看>>
win10新装系统,显卡风扇转动,链接正常开机,但设备管理器如果显示,无法更新驱动...
查看>>
mysql数据库管理工具sqlyog在首选项里可以设置默认查询分页条数和字体,改写关键字大小写...
查看>>
windows下cmd清屏命令cls
查看>>
github如何添加新的分支
查看>>
例题3-4 周期串
查看>>
51nod 最长公共子序列Lcs
查看>>
模型二
查看>>
操作系统知识体系总结
查看>>
TCP通信
查看>>
Docker存储驱动之总览
查看>>
306. Additive Number java solutions
查看>>
mysql+sqlserver 分页sql语句
查看>>
【学习】分支语句加一点小知识1026
查看>>
1; XHTML 基本知识
查看>>
定期来一次“绩效谈话”(摘自易中)
查看>>
Vs2013中通过Nuget添加不同版本jQuery
查看>>
webpack 相关资料
查看>>
HTTP状态码(HTTP Status Code),常见的error 404, error 504等的意思
查看>>