Delegate는 어떤 객체가 해야하는 일을 부분적으로 확장해서 대신 처리합니다.
1. 여러 클래스에서 겹치는 매소드를 줄이기 위해 사용합니다.
2. 하나의 독립적인 행동이 필요하지만, 추후에 이 행동이 바뀔 수 있는 상황에서 사용합니다.
3. 하나의 상속된 형태를 위임과 함께 사용하기 위해 사용합니다
▶︎ Delegate 기본적으로 특정 protocol을 상속받아 protocol 내에 함수들을 override하여 사용한다.
▶︎ 수신자는 위임자에게 self로 자기 자신을 넘겨주고 위임자는 수신자 객체의 메소드를 '대신'실행한다.
각각의 Delegate들은 Delegate Protocol에 의해 나열된 그들의 규칙이 있습니다. 해당 protocol을 따르게 된다면 반드시 구현해야하는 함수들이다.
protocol CartTableViewCellDelegate: class {
func didDeleteButtonTapped(storeItem: StoreItem)
}
Receiver 클래스에 SomeDelegate를 채택해서 해당 클래스가 SomeDelegate protocol을 따른다는 것을 표현할 수 있습니다.
class CartTableView: UITableViewController, SomeDelegate {
.........
}
protocol을 따르는 객체는 일의 목록을 수행해야하는데 (함수 구현), 그 전에 이 일이 어떤 객체로부터 주어졌는지를 명시해야함
class CartTableView: UITableViewController, SomeDelegate {
......
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "CartTableViewCell", for: indexPath)
as? CartTableViewCell else { return UITableViewCell() }
let item = Array(user.cart.keys)[indexPath.row]
cell.setInfo(with: item, number: self.user.cart[item] ?? 0 )
cell.cartTableViewCellDelegate = self
return cell
}
......
}
요구한 일을 수행하기, 즉 protocol의 함수들을 구현.
class CartTableView: UITableViewController, SomeDelegate {
......
func didDeleteButtonTapped(storeItem: StoreItem) {
user.cart.removeValue(forKey: storeItem)
tableView.reloadData()
}
......
}
class CartTableViewCell: UITableViewCell {
var cartTableViewCellDelegate: CartTableViewCellDelegate?
@IBAction func deleteButtonTapped(_ sender: Any) {
cartTableViewCellDelegate?.didDeleteButtonTapped(storeItem: self.storeItem)
}
}
tableViewCell의 delete버튼을 누르면 TableView의 didDeleteButtonTapped()에서 cart의 해당항목을 삭제하고 reloadData를 통해 해당 셀이 사라진것을 확인할 수 있다.
------------------ 참고 및 출처 ------------------------
https://baked-corn.tistory.com/23
https://zeddios.tistory.com/8
https://namget.tistory.com/entry/디자인패턴-Delegation-Pattern