티스토리 뷰

iOS

[iOS] Delegate Pattern 톺아보기

국산 앨런 2019. 7. 31. 14:28

iOS 개발에서 정말 많이 쓰이는 Delegation Pattern에 대해서 알아보겠습니다.

Delegate

위임하다

Delegate Pattern

하나의 객체가 다른 객체를 대신해 동작 또는 조정할 수 있는 기능을 제공합니다.

 

다시 말해, 어떤 객체에서 일어나는 이벤트에 관한 혹은 어떤 객체에 뿌려줄 데이터에 관한 코드를 다른 객체에서 작성해주는 것을 말합니다.

 

그리고 이러한 행위는 반드시 protocol을 동반합니다.

CEO/ secretary

Delegate Pattern을 이해하기 정말 좋은 Bob 님의 블로그 예시 '사장과 비서'를 인용해서 설명을 이어가겠습니다. 

 

protocol JobDelegate{	//protocol : 서로간의 소통을 위한 약속
    func passData(jobResource: String)
}

class Ceo{
    var delegate: JobDelegate?
}

class Secretary: JobDelegate{	//Delegate 에서 필요한 로직을 구현
    func passData(jobResource: String) {
        print("Ceo ask me to do \(jobResource)")
    }
}

...

	let ceo = Ceo()
	let secretary = Secretary()
	ceo.delegate = secretary
	ceo.delegate?.passData(jobResource: "Give me Coffee")

...

//"Ceo ask me to do Give me Coffee"

 

CEO는 비서에게 업무에 대한 지시만 해주고 일을 위임합니다. 비서는 그 일을 처리하고 그에 대한 결과는 CEO가 다시 알아서 가져갑니다.

 

왜 그래야 할까요??

예로 UITableView를 살펴보겠습니다

 

extension ViewController: UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //tells the delegate that the specified row is now selected
    }
    func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) {
        //tells the delegate that the specified row will begin editing
    }
    func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) {
        //tells the delegate that the specified row did end editing
    }
}

extension ViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
}

 

**  일을 위임한 UITableView객체에 대해서, UITableViewDelegate 는 어떤 행동(event)에 대한 코드를 부여하면 동작을 하고 UITableViewDataSource는 데이터를 받아 뷰(반환값에 따라)를 그려주는 역할을 합니다. **

 

위의 함수들은 많이 보셨을 거라 생각합니다. 코드설명은 밑에서 이어서 하기로 하고 여기서는 왜 쓰는가를 먼저 말씀드리겠습니다.

 

UITableView를 구성할때 우리는 저 함수들을 채워넣거나, 적절한 값을 return해주기만 하면 잘 작동합니다.

 

??? 어떻게 ??? 저 함수들의 파라미터는 어디서 오는 것인고 ??? 나 몰라도 돼 ???

 

네. 우리는 이것만 하면 돼요. 

tableView.delegate = self
tableView.dataSource = self

 

나머지는 UITableView객체가 알아서 하는 것이고 Delegate 받은 Class, Struct 에서는 할당 맡은 업무 (코드블럭 채우기) 만 하면 됩니다.

 

Delegation 패턴은 iOS 환경에서 정말 빈번하게 사용되고 있습니다. 예시를 직접 만들어 보셔도 좋고 UITableViewDelegation, UITableView 등의 내부 구현을 살펴보시는 것도 정말 좋습니다 ! 

 

 

참고 : https://www.edwith.org/boostcourse-ios/lecture/16856/ , https://www.bobthedeveloper.io/blog/the-complete-understanding-of-swift-delegate-and-data-source?fb_comment_id=1599033846783221_1617140354972570

댓글
공지사항