額外說明:
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 []
}
}