iOS - swift 拓展添加属性

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)
        }

你可能感兴趣的:(iOS - swift 拓展添加属性)