swift3.0 运行时获取类的属性
//定义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列表同理。。。
swift3.0 运行时获取类的属性的更多相关文章
- iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势
使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...
- Java 反射(二)运行时获取类的信息
目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...
- 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素
[源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...
- Swift3.0语言教程获取字符串长度
Swift3.0语言教程获取字符串长度 Swift3.0语言教程获取字符串长度,当在一个字符串中存在很多的字符时,如果想要计算字符串的长度时相当麻烦的一件事情,在NSString中可以使用length ...
- iOS学习之Objective-C 2.0 运行时系统编程
0 导言 本主主要内容包括: 1.概述2.参考3.运行时系统的版本和平台4.和运行时系统的交互5.消息6.动态方法解析7.消息转发8.类型编码9.属性声明 1 概述 Objective-C语言将决定尽 ...
- Runtime获取类的属性列表和方法列表
Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...
- Swift3.0语言教程获取字符串编码与哈希地址
Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...
- Swift3.0语言教程获取C字符串
Swift3.0语言教程获取C字符串 Swift3.0语言教程获取C字符串,为了让Swift和C语言可以实现很好的交互,开发者可以使用NSString的cString(using:)方法在指定编码格式 ...
- Android6.0运行时权限(基于RxPermission开源库)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. And ...
随机推荐
- knockout笔记
根据汤姆大叔博客总结-笔记: =============<script type="text/javascript"> $(function () { var View ...
- wcf契约版本处理与异常处理(随记)
-----------版本控制策略:必须支持向后兼容:----就是当服务端发生改变,但客户端未更新会不会发生错误: 一旦契约发布,若要契约发生变化,如何不影响客户端使用: ----wsdl:契约: 服 ...
- 关于ListView中convertView的缓存个数的探究
在面试的时候经常会被问到一个有关ListView的问题:一个ListView的高度最多可以显示5个item,但是却有20条数据要显示,问最多会有多少个convertView会被复用?或者如在ListV ...
- Visual Studio 20**自动添加头部注释信息
关于Visual Studio 20**自动添加头部注释信息 作为一个万年潜水党,不关这一篇文章技术含量如何,也算是一个好的开始吧. 在日常的开发中我们经常需要为类库添加注释和版权等信息,这样 ...
- Android系统源码导入到eclipse
1.把eclipse工程配置文件复制到android源码根目录下 cp development/ide/eclipse/.classpath ./ 2. 在android源码根目录下新建文 ...
- c# 使用Codosys.dll(CDO)发送邮件
准备工作: 从C:\Windows\System32将Codosys.dll拷到你的项目里,然后引用,或者直接引用Com组件也可以 然后看代码 ///<summary> /// 构造函数 ...
- PRML 第三章 - 线性回归
这段时间组里在有计划地学习书籍PRML (Pattern Recognition and Machine Learning),前两天自己做了一个里面第三章linear regression的分享,这里 ...
- SolrCloud攻略
SolrCloud攻略 近期一直在使用SolrCloud,乘着酒醉大概总结一下. 1.安装 原来一直有个误区,认为SolrCloud启动时,必须至少有个core才可以,其实不然. 首先按照Solr官方 ...
- Jenkins中关于一些插件的使用
Jenkins中关于一些插件的使用方法 最近在为公司搭建CI平台过程中,以及在具体项目实施过程中使用过的一些插件的具体用法: 1. ant插件 这个插件可能是我们最为经常使用的,若构建脚本是使用bui ...
- ASP.NET MVC3开发 - CodeFisrt数据库篇之M层验证之调用远程方法(Remote)验证
本文讲述在作者在使用.net mvc3进行开发的时候用到的两种调用远程验证的方法,第一种方法比较傻瓜,第二种方法方便好用,调用远程验证是个比较常见的验证方法,比如注册用户时的用户名唯一性验证. 作者原 ...