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