加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift3.0 运行时获取对象属性列表

发布时间:2020-12-14 06:30:19 所属栏目:百科 来源:网络整理
导读:新建一个类:Person.swift,创建两个对象 //基本数据类型,如果定义成可选,运行时同样取不到,使用KVC就会崩溃 //var age: Int? var age: Int = 0 //private 修饰的属性,使用运行时,同样获取不到属性(可以获取到ivar),也会让KVC崩溃 //private var title: String

新建一个类:Person.swift,创建两个对象

//基本数据类型,如果定义成可选,运行时同样取不到,使用KVC就会崩溃
//var age: Int?
var age: Int = 0

//private 修饰的属性,使用运行时,同样获取不到属性(可以获取到ivar),也会让KVC崩溃
//private var title: String?
var title: String?

使用运行时获取当前类所有属性的数组

class func propertyList() -> [String] {
    var count: UInt32 = 0
    //获取类的属性列表,返回属性列表的数组,可选项
    let list = class_copyPropertyList(self,&count)
    print("属性个数:(count)")
    //遍历数组
    for i in 0..<Int(count) {
        //根据下标获取属性
        let pty = list?[i]
        //获取属性的名称<C语言字符串>
        //转换过程:Int8 -> Byte -> Char -> C语言字符串
        let cName = property_getName(pty!)
        //转换成String的字符串
        let name = String(utf8String: cName!)
        print(name!)
    }
    free(list) //释放list
    return []
}
//控制器调用print(Person.propertyList())打印输出:
属性个数:2
age
title
[]

使用guard语法改写for循环内部实现

class func propertyList() -> [String] {
    var count: UInt32 = 0
    //1.获取类的属性列表,&count)
    print("属性个数:(count)")
    for i in 0..<Int(count) {
        //使用guard语法,一次判断每一项是否有值,只要有一项为nil,就不再执行后续的代码
        guard let pty = list?[i],let cName = property_getName(pty),let name = String(utf8String: cName)
            else {
                //继续遍历下一个
                continue
        }
        print(name)
    }
    free(list)
    return []
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读