反射的作用包括
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 {
private 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: nil
key:price, value: 10
key:page, value: 200
Book