удаление дублирующего кода из делегата ячейки - PullRequest
1 голос
/ 31 октября 2019

У меня есть таблица, чтобы настроить ячейку (из VC),

cell.model = dataSource[indexpath.row]

В didSet of cell.model я инициализирую содержимое ячейки. В ячейке есть 3 кнопки, нажав на которые, я информирую ВК через CellDelegate

protocol CellDelegate {
    func didTapButton1(model: Model)
    func didTapButton2(model: Model)
    func didTapButton3(model: Model)
}

Моя проблема: - Я не хочу передавать модель здесь (так как она ужесвязано с ячейкой - как-то нужно выбрать модель из ячейки) Я хотел бы вызвать didTapButton () без параметра. Тогда в VC

extension VC: CellDelegate {
//I need to fetch the model associated with the cell.
    func didTapButton1() { }
    func didTapButton2() { }
    func didTapButton3() { }
}

я мог бы добиться этого с помощью замыкания, но это здесь не является предпочтительным. Любая помощь будет оценена. *

1 Ответ

0 голосов
/ 31 октября 2019

Я предполагаю, что причина, по которой вы не хотите передавать модель, заключается в том, что наличие model во всех трех методах выглядит как дублирование кода. Хорошо, если вы посмотрите на делегатов в структуре, таких как UITableViewDelegate, UITextFieldDelegate, большинство из них, если не все, примут вещь, делегатом которой они являются, в качестве первого параметра. Все методы в UITableViewDelegate имеют параметр tableView. Поэтому было бы хорошо, если бы вы следовали шаблону:

protocol CellDelegate {
    func didTapButton1(_ cell: Cell)
    func didTapButton2(_ cell: Cell)
    func didTapButton3(_ cell: Cell)
}

Лично я бы написал в этом делегате только один метод:

protocol CellDelegate {
    func didTapButton(_ cell: Cell, buttonNumber: Int)
}

В расширении VC:Вы просто проверяете buttonNumber, чтобы увидеть, какая кнопка нажата:

switch buttonNumber {
    case 1: button1Tapped()
    case 2: button2Tapped()
    case 3: button3Tapped()
    default: fatalError()
}

// ...

func button1Tapped() { ... }
func button2Tapped() { ... }
func button3Tapped() { ... }
...