前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift3.0 - 黑魔法swizzle

Swift3.0 - 黑魔法swizzle

作者头像
酷走天涯
发布2018-09-14 14:57:40
3930
发布2018-09-14 14:57:40
举报
文章被收录于专栏:每日一篇技术文章
  • 举个例子理解一下

如果你想统计App中所有页面的点击事件,最简单快捷的方式是什么?

代码语言:javascript
复制
  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)
}
}

使用

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.10.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档