Swift不允许在extension(类扩展)中直接添加属性。
可以使用OC的关联属性(objc_set/getAssociatedObject)实现添加属性
extension UIView{
var name:String{
get {
return (objc_getAssociatedObject(self, &ExtensionViewKey) as? String)!
}
set {
objc_setAssociatedObject(self, &ExtensionViewKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
}
应用
让UIView具备使用闭包具备点击事件
private var key: Void?
extension UIView{
var touchViewClick:((_ tap:Int)->Void)?{
get {
return objc_getAssociatedObject(self, &key) as? (Int) -> Void
}
set {
objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
func touchClick(_ block:@escaping (Int) -> Void){
self.touchViewClick = block
isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(extensionTouchClick))
self.addGestureRecognizer(tap)
}
@objc func extensionTouchClick(tap:UITapGestureRecognizer){
guard let tag = tap.view?.tag else {
return
}
if let block = self.touchViewClick{
block(tag)
}
}
}
用法
let viewClick = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
viewClick.backgroundColor = .yellow
self.view.addSubview(viewClick)
viewClick.tag = 100
viewClick.touchClick{
print($0)
}
网友评论