额外拆入一个实用点,为了区分跟类自带函数名的相同,我们利用结构体来增加一个层级
//定一个结构体
public struct ZXSwift<Base> {
public let base : Base
public init(_ base : Base) {
self.base = base
}
}
public extension NSObjectProtocol { //拓展NSObjectProtocol类
//定义一个我们需要的属性
public var zx : ZXSwift<Self> {
get{
return ZXSwift(self)
}
set{
}
}
}
定义好一个结构体之后,我们利用结构体拓展NSObject类
extension ZXSwift where Base: NSObject{
func associate(value :Any?,forKey :inout String){
objc_setAssociatedObject(base, &forKey, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
func associatedValue(forKey :inout String) -> Any?{
return objc_getAssociatedObject(base, &forKey)
}
func removeAllassociate(){
objc_removeAssociatedObjects(base)
}
}
下面是重点,要拓展UIView类了
private var UIViewTapKey = "UIViewTapKey"
typealias tapBlock = () -> Void
extension ZXSwift where Base: UIView{
func tapped(block :@escaping () -> Void){
base.isUserInteractionEnabled = true
let tapGest = UITapGestureRecognizer(target: base, action: #selector(base.tappedAction))
tapGest.numberOfTapsRequired = 1
tapGest.numberOfTouchesRequired = 1
base.addGestureRecognizer(tapGest)
base.zx.associate(value: block, forKey: &UIViewTapKey)
}
fileprivate func tappedAction(){
if let tapBlock = base.zx.associatedValue(forKey: &UIViewTapKey) as? () -> Void{
tapBlock()
}
}
}
封装完成,我们来调用一下
let lb = UILabel()
lb.zx.tapped {
}
let img = UIImageView()
img.zx.tapped {
}
怎么样,是不是很方便