不管是OC还是Swift,一个继承自UIControl的类比如UIButton,注册一个点击事件的时候都会这么做:
Btn.addTarget............
说实话,已经用烦了!
封装一个
// MARK: - UIControl 添加 闭包
/// UIControl 的 Target-Action 转换为闭包的‘辅助类’
class ClosureSleeve {
let closure: () -> ()
init(attachTo: AnyObject, closure: @escaping () -> ()) {
self.closure = closure
objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN)
}
@objc func invoke() {
closure()
}
}
/// 将UIControl 的 Target-Action 转换为闭包
extension UIControl {
func addAction(for controlEvents: UIControl.Event = .primaryActionTriggered, action: @escaping () -> ()) {
let sleeve = ClosureSleeve(attachTo: self, closure: action)
addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
}
}
然后 Btn.addAction{ code } 即可,就很有Swift风格了