额外说明:
1、基本数据类型,在OC中没有可选,如果定义为可选,运行时同样获取不到,使用KVC就会崩溃
2、private的属性,使用运行时,同样获取不到属性(可以获取到ivar),同样会让KVC崩溃
class Person: NSObject {
var name: String?
//基本数据类型,在OC中没有可选,如果定义为可选,运行时同样获取不到,使用KVC就会崩溃
//var age: Int?
var age: Int = 0
//private的属性,使用运行时,同样获取不到属性(可以获取到ivar),同样会让KVC崩溃
//private var title: String?
var title: String?
//运行时获取到对象的属性列表:通过KVC动态的设置值
//运行时获取对象的方法列表:通过setMessage动态的发送任何消息
//运行时获取对象的ivars列表:这是所有第三方框架字典转模型的基础
//目标:使用运行时获取当前类所有属性的数组
//class修饰类方法
class func propertyList() -> [String]{
//注意这里一定要用var
var count: UInt32 = 0
//1、获取类的属性列表 返回属性列表的数组(这是可选项)
//<#T##outCount: UnsafeMutablePointer<UInt32>!##UnsafeMutablePointer<UInt32>!#>可变的Unit32类型的指针
var list = class_copyPropertyList(self, &count)
print("属性的数量:\(count)")
//2、遍历数组
// for i in 0..<Int(count){
// //3、根据下标获取属性
// //objc_property_t?
// let pty = list?[i]
// //4、获取属性的名称 (c语言的字符串)
// let cName = property_getName(pty!)
// //5、转换成OC的字符串
// let name = String(utf8String: cName!)
// print(name ?? "")
// }
//改写
for i in 0..<Int(count){
//使用guard let语法一次判断每一项是否有值,只要有一项为nil,就不在执行后续的代码。
//3、根据下标获取属性
//4、获取属性的名称 (c语言的字符串)
guard let pty = list?[i],let cName = property_getName(pty) else{
//继续遍历下一个
continue
}
//5、转换成OC的字符串
let name = String(utf8String: cName)
print(name ?? "")
}
//6、释放C语言的对象
free(list)
//[]是一个空数组
return []
}
}