티스토리 뷰
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
'iOS' 카테고리의 다른 글
[iOS] 타겟-액션 (tartget-action) 패턴 톺아보기 (0) | 2019.07.31 |
---|---|
[iOS] Swift 싱글턴 톺아보기 (0) | 2019.07.31 |
[iOS] 뷰의 상태변화 감지 메서드 톺아보기 (0) | 2019.07.29 |
[iOS] 모달 톺아보기 (0) | 2019.07.24 |
[iOS] Navigation Interface 톺아보기 (0) | 2019.07.23 |