如何分解包含选择器的函数?

how to factorize a function including a selector?

我有几个视图具有相同的操作。我试图分解这个函数,但没有成功。 这是 ViewController:

中的部分代码
class MenuViewController: UIViewController {

    @IBOutlet weak var addButton: FloatingActionButton!
    @IBOutlet weak var viewCALORIES: UIView!
    @IBOutlet weak var viewPROTEINES: UIView!
    @IBOutlet weak var viewLIPIDES: UIView!
    @IBOutlet weak var viewGLUCIDES: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // BoingCalories Protéines Lipides Glucides
        let tapCalories = UITapGestureRecognizer(target: self, action: #selector(boingCALORIES(gesture:)))
        viewCALORIES.addGestureRecognizer(tapCalories)
        
        let tapProteines = UITapGestureRecognizer(target: self, action: #selector(boingPROTEINES(gesture:)))
        viewPROTEINES.addGestureRecognizer(tapProteines)
        
        let tapLipides = UITapGestureRecognizer(target: self, action: #selector(boingLIPIDES(gesture:)))
        viewLIPIDES.addGestureRecognizer(tapLipides)
        
        let tapGlucides = UITapGestureRecognizer(target: self, action: #selector(boingGLUCIDES(gesture:)))
        viewGLUCIDES.addGestureRecognizer(tapGlucides)
        
        }


    @objc private func boingCALORIES(gesture: UITapGestureRecognizer) {
        viewCALORIES.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
        UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.4, options: [], animations: { self.viewCALORIES.transform = .identity }, completion: nil)
    }
    
    @objc private func boingPROTEINES(gesture: UITapGestureRecognizer) {
        viewPROTEINES.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
        UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.4, options: [], animations: { self.viewPROTEINES.transform = .identity }, completion: nil)
    }
    
    @objc private func boingLIPIDES(gesture: UITapGestureRecognizer) {
        viewLIPIDES.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
        UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.4, options: [], animations: { self.viewLIPIDES.transform = .identity }, completion: nil)
    }
    
    @objc private func boingGLUCIDES(gesture: UITapGestureRecognizer) {
        viewGLUCIDES.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
        UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.4, options: [], animations: { self.viewGLUCIDES.transform = .identity }, completion: nil)
    }

我尝试了一些测试,但都失败了。那么我怎么能分解所有这些呢? 谢谢

UITapGestureRecognizer,您可以检索视图。

let view = gesture.view

所以你可以这样做:

@objc private func boingView(gesture: UITapGestureRecognizer) {
    let view = gesture.view
    view.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
    UIView.animate(withDuration: 0.6, 
                   delay: 0,
                   usingSpringWithDamping: 0.3,
                   initialSpringVelocity: 0.4,
                   options: [],
                    animations: { view.transform = .identity },
                    completion: nil)
}

并分解调用:

let action = #selector(boingView(gesture:))

let tapCalories = UITapGestureRecognizer(target: self, action: action)
viewCALORIES.addGestureRecognizer(tapCalories)
        
let tapProteines = UITapGestureRecognizer(target: self, action: action)
viewPROTEINES.addGestureRecognizer(tapProteines)
        
let tapLipides = UITapGestureRecognizer(target: self, action: action)
viewLIPIDES.addGestureRecognizer(tapLipides)
        
let tapGlucides = UITapGestureRecognizer(target: self, action: action)
viewGLUCIDES.addGestureRecognizer(tapGlucides)

如果我们更进一步,我们可以将视图放入一个数组中并在它们上循环:

let views = [viewCALORIES, viewPROTEINES, viewLIPIDES, viewGLUCIDES]
let action = #selector(boingView(gesture:))

views.forEach { aView in
    let tap = UITapGestureRecognizer(target: self, action: action)
    aView.addGestureRecognizer(tap)
}