Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑
- 举个例子理解一下
如果你想统计App中所有页面的点击事件,最简单快捷的方式是什么?
extension UIButton{
class func swip(){
// 创建一个结构体,写个静态变量
struct T{
static let x:Bool = {
let cls: AnyClass = UIButton.self
// 创建消息对象
let originalSelector = #selector(UIButton.sendAction(_:to:for:))
let swizzleSelector = #selector(UIButton.swizzle_sendAction(action:to:forEvent:))
// 创建方法
let ori_method = class_getInstanceMethod(cls, originalSelector)
let swi_method = class_getInstanceMethod(cls, swizzleSelector)
print(ori_method)
print(swi_method)
// 交换两个方法的实现部分
method_exchangeImplementations(ori_method,swi_method)
print("执行了............")
return false
}()
}
// 这里必须执行一下,不然没法创建静态变量
T.x
}
// 定义要交换的函数
public func swizzle_sendAction(action: Selector,
to: AnyClass!,
forEvent: UIEvent!){
// 定义一个累加器
struct button_tap_count{
static var count = 0
}
button_tap_count.count += 1
print(button_tap_count.count)
// 看似好像调用了自己构成死循环,但是 我们其实已经将两个方法名的实现进行了调换 所以 其实我们调用的是 方法sendAction:to:forEvent 的实现 这样就可以在不破环原先方法结构的基础上进行交换实现
swizzle_sendAction(action: action, to: to, forEvent: forEvent)
}
}
使用
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// 执行一次交换方法
UIButton.swip()
button.addTarget(self, action: #selector(tap(button:)), for: .touchUpInside)
}
func tap(button:UIButton){
print("你好")
}
}
运行结果:
1
你好
2
你好
3
你好
4