[iOS] Delegate 패턴

Erick·2023년 1월 21일
0

iOS

목록 보기
1/4
post-thumbnail

Delegate 패턴


오늘은 iOS에서 많이 사용하는 디자인 패턴인 Delegate 패턴에 대해 알아보겠습니다.

Delegate 패턴이란?

Delegate는 대리자 혹은 위임자라는 뜻을 가지고 있습니다. 즉 대리자를 사용하는 패턴이라고 할 수 있습니다.
그럼 여기서 무엇을 대리하느냐? 처리해야 할 일을 위임합니다.
하나의 객체가 모든 일을 처리하지 않고 처리하는 일을 다른 객체에게 위임하여 처리하는 것을 Delegate 패턴이라고 합니다.

Delegate 패턴의 예시

간단히 테이블뷰를 설정하는 코드를 예로 들겠습니다.

//ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        return cell
    }
}

위 코드는 ViewController에 테이블뷰를 연결하고 셀을 설정하는 코드입니다.
테이블뷰가 있는 앱을 만들 때 자주 보던 코드이죠?
UITableViewDelegate, UITableViewDataSource 프로토콜을 채택한 후

tableView.delegate = self
tableView.dataSource = self

위와 같이 =self를 해주면 ViewController로 기능을 위임한다는 뜻입니다.
그럼 ViewController의 extension 부분에 보이는 것과 같이 tableView의 여러 메서드를 사용할 수 있습니다.

Delegate 패턴으로 데이터 전달하기

Delegate 패턴으로 단순히 메서드만 사용하는 것이 아닌 vc 간 데이터를 전달하는 것도 가능합니다.

//SecondViewController.swift
protocol SendProtocol {
  func dataSend(data: String)
}

class SecondVC: UIViewController {

  @IBOutlet weak var dataTextField: UITextField!
  
  var delegate : SendProtocol?
  
  override func viewDidLoad() {
        super.viewDidLoad()
    }
    
  @IBAction func sendButtonTapped(_ sender: Any) {
    if let text = dataTextField.text {
      delegate?.dataSend(data: text)
    }
    
    self.navigationController?.popViewController(animated: true)
  }
}

SecondVC에서 dataSend라는 String 데이터를 보내는 메서드를 가진 프로토콜을 생성한 후 SendProtocol을 채택한 변수를 생성하고 버튼을 눌렀을 때 TextField에 입력한 데이터를 전송할 수 있도록 설정한 뒤

//FirstViewController.swift
class FirstVC: UIViewController, SendProtocol {
  
  @IBOutlet weak var dataLabel: UILabel!
  
  override func viewDidLoad() {
    super.viewDidLoad()
  }

  func dataSend(data: String) {
    dataLabel.text = data
  }
  
  @IBAction func nextButtonTapped(_ sender: Any) {
    guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC else {return}
    
    nextVC.delegate = self
    
    self.navigationController?.pushViewController(nextVC, animated: true)
  }
}

FirstVC에서 SendProtocol을 채택 후 nextVC.delegate = self로 FirstVC를 위임자로 선언하고 dataSend 메서드를 확장하여 데이터를 가져올 수 있습니다.


마치며

VC 간 데이터 전달하는 법을 공부하다가 Delegate 패턴을 사용하는 방법만 이해가 어려워 이렇게 포스팅을 하게 되었네요.
평소에 자주 사용하던 디자인패턴인데 정확한 개념을 모르고 사용하다 이렇게 개념을 정확하게 알게 되니 앞으로 위임자를 선언하는 것뿐 아니라 확장하여 활용하는 것으로 사용할 수도 있을 것 같습니다.

profile
iOS Developer

0개의 댓글