Delegate 패턴

박성민·2020년 10월 20일
0

iOS

목록 보기
1/31

Delegate는 어떤 객체가 해야하는 일을 부분적으로 확장해서 대신 처리합니다.
1. 여러 클래스에서 겹치는 매소드를 줄이기 위해 사용합니다.
2. 하나의 독립적인 행동이 필요하지만, 추후에 이 행동이 바뀔 수 있는 상황에서 사용합니다.
3. 하나의 상속된 형태를 위임과 함께 사용하기 위해 사용합니다

▶︎ Delegate 기본적으로 특정 protocol을 상속받아 protocol 내에 함수들을 override하여 사용한다.

  1. 수신자 Receiver
  2. 위임자(대리자) Delegate
  3. 위임자에게 수신자 자신을 전달

▶︎ 수신자는 위임자에게 self로 자기 자신을 넘겨주고 위임자는 수신자 객체의 메소드를 '대신'실행한다.

Delegation 적용하기

1. 요구사항을 파악한다.

각각의 Delegate들은 Delegate Protocol에 의해 나열된 그들의 규칙이 있습니다. 해당 protocol을 따르게 된다면 반드시 구현해야하는 함수들이다.

protocol CartTableViewCellDelegate: class {
    func didDeleteButtonTapped(storeItem: StoreItem)
}

2. Delegation을 따른다/채택한다.

Receiver 클래스에 SomeDelegate를 채택해서 해당 클래스가 SomeDelegate protocol을 따른다는 것을 표현할 수 있습니다.

class CartTableView: UITableViewController, SomeDelegate {
	.........
}

3. Delegate 객체(일을 시키는 객체)와 연결을 한다.

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
    }
    
    ......
    
}

4. 요구사항들 구현하기

요구한 일을 수행하기, 즉 protocol의 함수들을 구현.

class CartTableView: UITableViewController, SomeDelegate {
	......
    func didDeleteButtonTapped(storeItem: StoreItem) {
    	user.cart.removeValue(forKey: storeItem)
        tableView.reloadData()
    }
    	......
}

5. Delegate객체에서 해당 함수를 실행

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

profile
iOS시작~

0개의 댓글