新建一个类: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 []
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。