Swift 使用函数类型的变量创建选择器

Swift 使用函数类型的变量创建选择器,swift,selector,Swift,Selector,我正在处理两个视图,它们是UITableViewCell的子类的子类。在UITableViewCell的基一子类中,我试图以一种方式设置手势识别器,使每个超类都可以改变行为,最终在其tap的委托上调用didTapped方法 我已经编写了以下代码。我可以使用selectortap,但是我认为在每个超类中使用变量而不是重写tap方法是一种更干净的方法。甚至可以使用selectortapFunc之类的工具吗?如果没有,从工程角度来看,什么是最干净和最好的解决方案 class BaseCell: UIT

我正在处理两个视图,它们是UITableViewCell的子类的子类。在UITableViewCell的基一子类中,我试图以一种方式设置手势识别器,使每个超类都可以改变行为,最终在其tap的委托上调用didTapped方法

我已经编写了以下代码。我可以使用selectortap,但是我认为在每个超类中使用变量而不是重写tap方法是一种更干净的方法。甚至可以使用selectortapFunc之类的工具吗?如果没有,从工程角度来看,什么是最干净和最好的解决方案

class BaseCell: UITableViewCell {

    @objc var tapFunc: () -> () = { () in
        print("Tapped")
    }

    @objc func tap() {
        print("TEST")
    }

    func setupBasicViews(withContent: () -> ()) {

        let tapGestureRecoginzer = UITapGestureRecognizer(target: self, action: #selector(tapFunc))
        contentView.isUserInteractionEnabled = true
        contentView.addGestureRecognizer(tapGestureRecoginzer)
    }
}
然后是在这一视图之上构建的两个视图:

class ViewA: BaseCell {

    //don't want to do this
    override func tap() {
        //do stuff
    }

    func setup {
        //setup everything else
    }

class ViewB: BaseCell {

   var delegate: ViewBProtocool?

    func setup {
        tapFunc = { () in
            delegate?.didTapped(self)
        }
        //setup everything else
    }

你离得不远。进行以下更改:

class BaseCell: UITableViewCell {
    var tapFunc: (() -> Void)? = nil

    // Called by tap gesture
    @objc func tap() {
        tapFunc?()
    }

    func setupBasicViews(withContent: () -> ()) {

        let tapGestureRecoginzer = UITapGestureRecognizer(target: self, action: #selector(tap))
        contentView.isUserInteractionEnabled = true
        contentView.addGestureRecognizer(tapGestureRecoginzer)
    }
}

class ViewA: BaseCell {
    func setup() {
        //setup everything else
    }
}

class ViewB: BaseCell {
    var delegate: ViewBProtocol?

    func setup() {
        tapFunc = {
            delegate?.didTapped(self)
        }
        //setup everything else
    }
}
现在,每个子类都可以选择性地为tapFunc属性提供闭包


我在上面展示了tapFunc是可选的,在基类中没有默认功能。如果需要的话,可以随意更改它以提供一些默认功能。

我建议使用选择器类型的变量,但我更喜欢使用调用闭包的固定选择器的解决方案。投票