Runtime相关-Swift
深入了解过Objective-C这门语言的人一定知道,这是一门动态语言。在日常的开发中,也常常会使用到Runtime对自己的项目做一些小”手脚”,比如说替换这些视图控制器的viewWillAppear方法让他们在启动的时候能在自己的事件日志中记录一下,或者是记录一下这个视图控制器的时间;或者是对某个模型做一些便利化的操作,比如说动态的获取到模型里边的属性名称,然后自动的encode与decode,将JSON自动的转为Model之类的操作。
但在Swift中,纯的Swift类是没有Runtime这个概念的,它的函数调用已经不是obj-c的objc——msgsend,在编译时就确定了要调用说明函数。
可是如果你把你的Swift类继承自NSObject,它就具有了动态性,也能使用Runtime的方法了。有一点要注意的是,Tuple这个类型是swift独有的无法映射到OC,所以就无法通过runtime获取。
下面是一个简单的例子,通过runtime交换Button的点击事件,来实现Button不能无限点击的效果:
|
如果有些Button需要不延时点击的话,可以给Button加上一个tag判断即可
下面还有一个runtime的使用场景:
当我们用NSCoding协议进行序列化和反序列化的时候,通常的做法是在encoder和decoder中把每一个属性都写进去,但是如果这个类有很多属性的时候,这就变成了一件麻烦事;
这时我们就可以使用runtime获取这个类的属性列表,然后遍历属性利用KVO进行归档和解档操作了
代码如下:
|
我们还可以自定义一个ArchivableObject的类,方便使用:
|
之前在OC中我们使用runtime的一个场景就是给一个类的category添加属性,同样在swift中我们还是可以这样使用,来给类的extension添加存储属性,代码如下:
|
在上面的代码中我们就给UIViewController的extension添加一个foo的属性。