//定义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 运行时获取类的属性的更多相关文章

  1. iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

    使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...

  2. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  3. 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素

    [源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...

  4. Swift3.0语言教程获取字符串长度

    Swift3.0语言教程获取字符串长度 Swift3.0语言教程获取字符串长度,当在一个字符串中存在很多的字符时,如果想要计算字符串的长度时相当麻烦的一件事情,在NSString中可以使用length ...

  5. iOS学习之Objective-C 2.0 运行时系统编程

    0 导言 本主主要内容包括: 1.概述2.参考3.运行时系统的版本和平台4.和运行时系统的交互5.消息6.动态方法解析7.消息转发8.类型编码9.属性声明 1 概述 Objective-C语言将决定尽 ...

  6. Runtime获取类的属性列表和方法列表

    Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...

  7. Swift3.0语言教程获取字符串编码与哈希地址

    Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...

  8. Swift3.0语言教程获取C字符串

    Swift3.0语言教程获取C字符串 Swift3.0语言教程获取C字符串,为了让Swift和C语言可以实现很好的交互,开发者可以使用NSString的cString(using:)方法在指定编码格式 ...

  9. Android6.0运行时权限(基于RxPermission开源库)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了. And ...

随机推荐

  1. [转]Android图片下载

    因为国内被墙,看起来不方便,转载下,原文地址:http://android-developers.blogspot.com/2010/07/multithreading-for-performance ...

  2. Javascript实例技巧精选(6)—滚动鼠标中键读取Json数据分页显示网页内容

    >>点击这里下载完整html源码<< 截图如下: 滚动鼠标中键读取Json数据分页显示网页内容,关键的Javascript如下: <script type="t ...

  3. 刚下载的几个开源的Android项目

    Android-Universal-Image-Loader Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你. Universa ...

  4. Effective C++(13) 用对象管理资源

    问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基 ...

  5. linux下监控进程需掌握的四个命令

    linux下监控进程需掌握的四个命令   在LInux系统下,最困难的工作之一就是跟踪正在系统中运行的程序,尤其是现在,图形桌面使用很多的程序,只是为了生成一个桌面环境,系统中运行了太多的进程,幸运的 ...

  6. JS图片自动或者手动滚动效果(支持left或者up)

    JS图片自动或者手动滚动效果(支持left或者up) JS图片自动或者手动滚动效果 在谈组件之前 来谈谈今天遇到搞笑的事情,今天上午接到一个杭州电话 0571-28001187 即说是杭州人民法院的 ...

  7. C# 脚本代码自动登录淘宝获取用户信息

    C# 脚本代码自动登录淘宝获取用户信息   最近遇到的一个需求是如何让程序自动登录淘宝, 获取用户名称等信息. 其实这个利用SS (SpiderStudio的简称) 实现起来非常简单. 十数行代码就可 ...

  8. 回调函数 use

    $info["fulltext"] = preg_replace_callback( $search2, function($matches) use ($search, $uni ...

  9. CodeForces Round

    CodeForces Round 199 Div2   完了,这次做扯了,做的时候有点发烧,居然只做出来一道题,差点被绿. My submissions     # When Who Problem ...

  10. 使用entity framework开发oracle

    A.vs2010 SP1 B.ODAC(http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html) ...