反射的作用包括
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
新聞熱點
疑難解答