十七、Swift3.0之使用運行時獲取屬性列表

額外說明:
1、基本數(shù)據(jù)類型,在OC中沒有可選,如果定義為可選,運行時同樣獲取不到,使用KVC就會崩潰
2、private的屬性,使用運行時,同樣獲取不到屬性(可以獲取到ivar),同樣會讓KVC崩潰

class Person: NSObject {
   var name: String?
   
   //基本數(shù)據(jù)類型,在OC中沒有可選,如果定義為可選,運行時同樣獲取不到,使用KVC就會崩潰
   //var age: Int?
   var age: Int = 0
   
   //private的屬性,使用運行時,同樣獲取不到屬性(可以獲取到ivar),同樣會讓KVC崩潰
   //private var title: String?
   var title: String?
   
   //運行時獲取到對象的屬性列表:通過KVC動態(tài)的設(shè)置值
   //運行時獲取對象的方法列表:通過setMessage動態(tài)的發(fā)送任何消息
   //運行時獲取對象的ivars列表:這是所有第三方框架字典轉(zhuǎn)模型的基礎(chǔ)
   
   //目標(biāo):使用運行時獲取當(dāng)前類所有屬性的數(shù)組
   //class修飾類方法
   class func propertyList() -> [String]{
       //注意這里一定要用var
       var count: UInt32 = 0
       //1、獲取類的屬性列表  返回屬性列表的數(shù)組(這是可選項)
       //<#T##outCount: UnsafeMutablePointer<UInt32>!##UnsafeMutablePointer<UInt32>!#>可變的Unit32類型的指針
       var list = class_copyPropertyList(self, &count)
       print("屬性的數(shù)量:\(count)")
       
       //2、遍歷數(shù)組
//        for i in 0..<Int(count){
//            //3、根據(jù)下標(biāo)獲取屬性
//            //objc_property_t?
//            let pty = list?[i]
//            //4、獲取屬性的名稱 (c語言的字符串)
//            let cName = property_getName(pty!)
//            //5、轉(zhuǎn)換成OC的字符串
//            let name = String(utf8String: cName!)
//            print(name ?? "")
//        }
       //改寫
       for i in 0..<Int(count){
           //使用guard let語法一次判斷每一項是否有值,只要有一項為nil,就不在執(zhí)行后續(xù)的代碼。
           //3、根據(jù)下標(biāo)獲取屬性
           //4、獲取屬性的名稱 (c語言的字符串)
           guard let pty = list?[i],let cName = property_getName(pty) else{
               //繼續(xù)遍歷下一個
               continue
           }
           //5、轉(zhuǎn)換成OC的字符串
           let name = String(utf8String: cName)
           print(name ?? "")
       }
    //6、釋放C語言的對象
    free(list)
    //[]是一個空數(shù)組
    return []
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容