反射的作用包括
1、 使用NSClassFromString通过类名得到实例; (类型于java的Class.forName和newInstance)
2、不知道对象包含哪些属性,使用Mirror得到属性值; (类似于Java的getDeclaredFileds函数)
得到实例分为3步(PS:跟Java很像,大道同源):
1、 得到应用名称;
2、 得到类的完整路径, 注意分隔符是小数点;并判断数据类型是否符合预期。 备注: as?后面的格式是类名.Type, cls可能是nil。
3、 调用init函数实例化;
let nameSpace = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String //得到应用名称guard let cls = NSClassFromString(nameSpace + "." + clsName) as? UIViewController.Type else { return } //得到类完整路径let vc = cls?.init()使用Mirror显示出对象的所有属性值(在JSON解析时会用到):
struct Book { let name: String? let PRice: Int let page: Int}let book = Book(name: nil, price: 10, page: 200)let mirror = Mirror(reflecting: book)for case let(key?, value) in mirror.children { print("key:/(key), value: /(value)") //打印成员属性}print(mirror.subjectType) //反射对象的数据类型输出:key:name, value: nilkey:price, value: 10key:page, value: 200Book
新闻热点
疑难解答