• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

swift3.0运行时获取类的属性

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
//定义Person类
class Person: NSObject {
    
    var name: String?
    
    //注意这里基本数据类型我定义的是必选属性
    var age: Int = 10
    
    override init() {
        
        super.init()
        
    }
    
    // MARK: - 定义类方法 查看本类的属性列表
    class func demo() -> () {
        
        var outCount: UInt32 = 0
        
        //调用runtime 方法 class_copyPropertyList 获取类的公有属性列表
        let propertyList = class_copyPropertyList(self, &outCount)
        
        //遍历数组
        for i in 0..<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 = 0
        
        //调用runtime 方法 class_copyPropertyList 获取类的公有属性列表
        let propertyList = class_copyPropertyList(self, &outCount)
        
        //遍历数组
        for i in 0..<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 = 0
        
        //调用runtime 方法 class_copyPropertyList 获取类的公有属性列表
        let propertyList = class_copyPropertyList(self, &outCount)
        
        //遍历数组
        for i in 0..<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列表同理。。。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode652.寻找重复的子树|FindDuplicateSubtrees发布时间:2022-07-13
下一篇:
NSHipster - Cocoa &amp; Swift发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap