額外說(shuō)明:
1、基本數(shù)據(jù)類型歌馍,在OC中沒有可選握巢,如果定義為可選,運(yùn)行時(shí)同樣獲取不到骆姐,使用KVC就會(huì)崩潰
2镜粤、private的屬性,使用運(yùn)行時(shí)玻褪,同樣獲取不到屬性(可以獲取到ivar)肉渴,同樣會(huì)讓KVC崩潰
class Person: NSObject {
var name: String?
//基本數(shù)據(jù)類型,在OC中沒有可選带射,如果定義為可選同规,運(yùn)行時(shí)同樣獲取不到,使用KVC就會(huì)崩潰
//var age: Int?
var age: Int = 0
//private的屬性,使用運(yùn)行時(shí)券勺,同樣獲取不到屬性(可以獲取到ivar)绪钥,同樣會(huì)讓KVC崩潰
//private var title: String?
var title: String?
//運(yùn)行時(shí)獲取到對(duì)象的屬性列表:通過(guò)KVC動(dòng)態(tài)的設(shè)置值
//運(yùn)行時(shí)獲取對(duì)象的方法列表:通過(guò)setMessage動(dòng)態(tài)的發(fā)送任何消息
//運(yùn)行時(shí)獲取對(duì)象的ivars列表:這是所有第三方框架字典轉(zhuǎn)模型的基礎(chǔ)
//目標(biāo):使用運(yùn)行時(shí)獲取當(dāng)前類所有屬性的數(shù)組
//class修飾類方法
class func propertyList() -> [String]{
//注意這里一定要用var
var count: UInt32 = 0
//1、獲取類的屬性列表 返回屬性列表的數(shù)組(這是可選項(xiàng))
//<#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語(yǔ)言的字符串)
// let cName = property_getName(pty!)
// //5儒拂、轉(zhuǎn)換成OC的字符串
// let name = String(utf8String: cName!)
// print(name ?? "")
// }
//改寫
for i in 0..<Int(count){
//使用guard let語(yǔ)法一次判斷每一項(xiàng)是否有值寸潦,只要有一項(xiàng)為nil,就不在執(zhí)行后續(xù)的代碼社痛。
//3见转、根據(jù)下標(biāo)獲取屬性
//4、獲取屬性的名稱 (c語(yǔ)言的字符串)
guard let pty = list?[i],let cName = property_getName(pty) else{
//繼續(xù)遍歷下一個(gè)
continue
}
//5蒜哀、轉(zhuǎn)換成OC的字符串
let name = String(utf8String: cName)
print(name ?? "")
}
//6斩箫、釋放C語(yǔ)言的對(duì)象
free(list)
//[]是一個(gè)空數(shù)組
return []
}
}