十七、Swift3.0之使用运行时获取属性列表

2017-02-27  本文已影响269人  ZhengYaWei

额外说明:
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 []
}

}

上一篇下一篇

猜你喜欢

热点阅读