美文网首页
Swift面向协议编程(一)

Swift面向协议编程(一)

作者: 萤火驻守心间 | 来源:发表于2022-05-22 20:40 被阅读0次

面向协议编程(Pop):
特点:
1、不相关的两个类型优先考虑协议
2、可以给协议添加扩展
3、协议可以继承其他协议

模拟场景:实现点击button使view与button同时抖动并改变圆角,点击view还原圆角。定义协议viewProtocol继承于两个自定义协议。其中temProtocol1负责修改/还原圆角; temProtocol2负责添加抖动效果。

效果如图所示:


image.png

说明:
1、一个协议也可实现效果,如果功能复杂时可用多个协议区分。此处多协议仅为参考
2、协议扩展让面向协议编程成为可能
自定义协议:

protocol viewProtocol:temProtocol1, temProtocol2{
}
protocol temProtocol1 {
    
}
extension temProtocol1 where Self: UIView{

    func changeRadio() {
        layer.cornerRadius = 10
        layer.masksToBounds = true
    }
    func returnBack() {
        layer.cornerRadius = 0
    }
}
protocol temProtocol2 {
    
}
extension temProtocol2 where Self : UIView {
    func shake() {
        let animation = CABasicAnimation(keyPath: "position")
        animation.duration = 0.05
        animation.repeatCount = 5
        animation.autoreverses = true
        animation.fromValue = NSValue(cgPoint: CGPoint(x: self.center.x-4.0, y: self.center.y))
        animation.toValue = NSValue(cgPoint: CGPoint(x: self.center.x+4.0, y: self.center.y))
        layer.add(animation, forKey: "position")
    }
}

自定义view和button:

class LeftView: UIView,viewProtocol {
    
    private var tem = LeftRightViewModel()
    var vm: LeftRightViewModel {
        set {
            tem = newValue
        }
        get {
            tem
        }
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
        let tap = UITapGestureRecognizer.init(target: self, action: #selector(clickLeft))
        addGestureRecognizer(tap)
    }
    @objc func clickLeft() {
        vm.leftViewClick()
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

class RightButton: UIButton,viewProtocol {
    private var tem = LeftRightViewModel()
    var vm: LeftRightViewModel {
        set {
            tem  = newValue
        }
        get {
            tem
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setTitle("btn", for: .normal)
        addTarget(self, action: #selector(btnClick), for: .touchUpInside)
    }
    
    @objc func btnClick() {
        vm.rightBtnClick()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

viewmodel:

class LeftRightViewModel: NSObject {
    
    var clickReturn : (()->())?
    var lclickReturn : (()->())?
    func leftViewClick() {
        //还原
        lclickReturn?()
    }
    func rightBtnClick() {
        //抖动
        clickReturn?()
    }
    
}

viewController:

class ViewController: UIViewController {
    let vm: LeftRightViewModel = LeftRightViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let left = LeftView(frame: CGRect(x: 140, y: 100, width: 100, height: 100))
        left.vm = vm
        left.backgroundColor = UIColor.lightGray
        view.addSubview(left)
        let right = RightButton(frame: CGRect(x: left.frame.maxX+30, y: 130, width: 40, height: 40))
        right.vm = vm
        right.backgroundColor = UIColor.orange
        view.addSubview(right)
        vm.clickReturn = {
            left.shake()
            right.shake()
            left.changeRadio()
            right.changeRadio()
        }
        vm.lclickReturn = {
            left.returnBack()
            right.returnBack()
        }
    }
}

相关文章

  • swift和OC的比较

    swift ----OC比较 编程范式 Swift 可以面向协议编程、函数式编程、面向对象编程。Objective...

  • [Swift5.1] 27-面向协议编程

    面向协议编程 面向协议编程(Protocol Oriented Programming,简称POP) 是Swift...

  • Swift 中协议的扩展的简单应用

    参考: Swift面向协议编程初探 从 Swift 的面向协议编程说开去 根据下面的结构 设计类和协议 使用:

  • Swift 中的面向协议编程

    Swift 中面向协议编程的应用,与面向对象不同的编程模式。在 Swift 这个现代化的编程语言中,感受面向协议带...

  • Swift 面向协议编程遇到的问题

    Swift 面向协议编程 背景 Swift 面向协议编程在 WWDC 2015 中提出, 业界已经有很多优秀的实践...

  • Swift面向协议编程

    Swift面向协议编程 不要用子类!Swift的核心是面向协议 Protocol Oriented Program...

  • 面向协议编程

    面向协议编程 面向协议编程Protocol Oriented Programming简称POP.是Swift的一种...

  • Swift从入门到精通-1

    一、Swift和Objective-C比较 1、编程范式:Swift可以面向协议编程,函数式编程,面向对象编程;O...

  • Swift-面向协议编程(转载)

    Swift的核心 我们可以通过等式的传递性来理解swift: Swift的核心是面向协议的编程。 面向协议的编程的...

  • swift注意事项

    一、编程范式 Swift 可以面向协议编程(POP)、函数式编程、面向对象编程。 Object-C 以面向对象编程...

网友评论

      本文标题:Swift面向协议编程(一)

      本文链接:https://www.haomeiwen.com/subject/ycetprtx.html