How to add a button with click event on UITableViewCell in Swift?

All patterns above are fine. my two cents, in case You add by code (for example multiple different cells and so on..) there is a FAR simple solution.

As buttons allow to specify a "target" You can pass directly the controller AND action to cell/button when setting it.

In controller:

let selector = #selector(self.myBtnAction)
setupCellWith(target: self, selector: selector)

...

in custom cell with button:

final func setupCellWith(target: Any? selector: Selector){
       btn.addTarget(target, 
        action: selector,
       for: .touchUpInside)

}

Popular patterns for solving this problem are closures and delegates. If you want to use closures, you would do something like this:

final class MyCell: UITableViewCell {
    var actionBlock: (() -> Void)? = nil

then

    @IBAction func didTapButton(sender: UIButton) {
        actionBlock?()
    }

then in your tableview delegate:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier") as? MyCell
    cell?.actionBlock = {
       //Do whatever you want to do when the button is tapped here
    }

A popular alternative is to use the delegate pattern:

    protocol MyCellDelegate: class {
        func didTapButtonInCell(_ cell: MyCell)
    }

    final class MyCell: UITableViewCell {
        weak var delegate: MyCellDelegate?

then

    @IBAction func didTapButton(sender: UIButton) {
        delegate?.didTapButtonInCell(self)
    }

.. Now in your view controller:

then in your tableview delegate:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier") as? MyCell
    cell?.delegate = self

And add conformance to the protocol like this:

extension MyViewController: MyCellDelegate {
    didTapButtonInCell(_ cell: MyCell) {
       //Do whatever you want to do when the button is tapped here
    }
}

Hope this helps!