//定义Person类
class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性
var age: Int = override init() { super.init() } // MARK: - 定义类方法 查看本类的属性列表
class func demo() -> () { var outCount: UInt32 = //调用runtime 方法 class_copyPropertyList 获取类的公有属性列表
let propertyList = class_copyPropertyList(self, &outCount) //遍历数组
for i in ..<Int(outCount) { // 取出数组中的元素 objc_property_t?
let pty = propertyList?[i] // 获取属性名称 是C字符串 UnsafePointer<Int8>?
let cName = property_getName(pty!) //转换成OC String?
let oName = String(utf8String: cName!) print(oName ?? "") } //因为propertyList数组是copy出来的,所以要释放数组
free(propertyList) } }

此时会输出name age ;  如果是基本数据类型的属性:int float ....  必须给属性赋初值 ,不然运行时获取不到该属性:

//定义Person类
class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是可选属性
var age: Int? override init() { super.init() } // MARK: - 定义类方法 查看本类的属性列表
class func demo() -> () { var outCount: UInt32 = //调用runtime 方法 class_copyPropertyList 获取类的公有属性列表
let propertyList = class_copyPropertyList(self, &outCount) //遍历数组
for i in ..<Int(outCount) { // 取出数组中的元素 objc_property_t?
let pty = propertyList?[i] // 获取属性名称 是C字符串 UnsafePointer<Int8>?
let cName = property_getName(pty!) //转换成OC String?
let oName = String(utf8String: cName!) print(oName ?? "") } //因为propertyList数组是copy出来的,所以要释放数组
free(propertyList) } }

此时会输出name , 也就是基本数据类型的属性, 如果是可选的, 那么运行时获取不到该属性。所以大家在定义属性的时候要谨慎, 尤其是字典转模型的时候要注意。

swift增加的guard守护,可以帮助我们解决可选值的烦恼,那么 我们优化一下代码

class Person: NSObject {

    var name: String?

    //注意这里基本数据类型我定义的是可选属性
var age: Int? override init() { super.init() } // MARK: - 定义类方法 查看本类的属性列表
class func demo() -> () { var outCount: UInt32 = //调用runtime 方法 class_copyPropertyList 获取类的公有属性列表
let propertyList = class_copyPropertyList(self, &outCount) //遍历数组
for i in ..<Int(outCount) { guard let pty = propertyList?[i],
let cName = property_getName(pty),
let oName = String(utf8String: cName)
else{
//如果 pty cName oName 不存在的话 继续遍历下一个
continue
}
print(oName) } //因为propertyList数组是copy出来的,所以要释放数组
free(propertyList) } }

获取ivar列表同理。。。

最新文章

  1. JS获取当前时间
  2. Linux下NDK编译FFMPEG包含neon参数
  3. 工作中一个简单的shell程序
  4. HTML5的 2D SVG和SVG DOM的学习笔记(2)---SVG动画
  5. 1、iOS9 HTTP 不能正常使用的解决办法
  6. Data URL
  7. 64 位系统遇到未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0
  8. HTML5学习(七)----地理定位
  9. 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
  10. Css 使div标签下沉到页面最低部
  11. WTL---WxWidget---MFC 何去何从
  12. bzoj1051(明星奶牛)
  13. sqli-lab 第一题 单引号 error based single quotes
  14. DedeCMS常见问题和技巧
  15. SecurityError: Blocked a frame with origin from accessing a cross-origin frame
  16. Android------------------ListVIew学习
  17. linux 命令 后台运行
  18. git删除本地的资源,如何恢复?
  19. 【C】——指针与const限定符
  20. C#-WebForm-AJAX阿贾克斯(二)★★★★★ajax的完整结构★★★★★

热门文章

  1. 开源文档管理系统LogicalDOC测试报告---安装篇
  2. PHP中实现在数据库中的增、删、查、改
  3. beanutils获取带参数get方法
  4. EF 关系描述
  5. .NET:线程本地存储、调用上下文、逻辑调用上下文
  6. Nginx+phpfastcgi下flush输出问题
  7. 企业架构研究总结(33)——TOGAF架构内容框架之架构制品(上)
  8. Go Code
  9. IOS学习之路七(通过xib自定义UITableViewCell)
  10. 线性回归,logistic回归和一般回归