Swift下实现方法交换method swizzle(转自Medium)
方法交换是oc的技术,可以借助runtime的动态派发的特性实现两个方法的实现部分互换;
那么在swift如果实现呢?
在我们深入挖掘实现细节之前,需要对selectors
相关的概念做一些说明
什么是selectors
selector
表示的一个类对象的方法的名称,selector
没有具体实现,不做任何事情,唯一的目标的就是标识一个方法
为什么使用方法交换(method swizzling)
有以下场景可以用到:
方便的在App监测一个ViewController
到另一个ViewController
的切换;
具体方法是修改viewWillAppear
的selector,添加一些监控行为
实现如下:
1 | dynamic func _swizzled_viewWillAppear(_ animated: Bool) { |
@objc
说明用到oc的特性方法dynamic
说明用到了动态这不是会循环调用么?为什么要调用自己? 不会,因为切换后内括号内的调用其实是调用了原有的
ViewWillAppear
通过method_exchangeImplementations
方法,实现两个方法的交换
1 | let selector1 = #selector(UIViewController.viewWillAppear(_:)) |
前面的实现整理到一起就完成了:
1 | extension UIViewController { |
别忘了调用方法交换
1 | UIViewController.swizzleViewWillAppear() |
现在,UIViewController
的所有实例和子类实例调用viewWillAppear时,都会触发 _swizzled_viewWillAppear
备注:
有两点要注意:
如果你要实现方法交换,你的类必须继承自
NSObject
你要交换的方法必须具有动态属性
@objc dynamic