Delegate :: to entrust to another
굳이 한국말로 번역하면 대리자 형식.
ios에서는 다른 객체에 기능을 위임시켜 동작하는 패턴을 일컫는다.
쇼핑몰 앱에서 사용하는 테이블 뷰에 상품을 클릭하면 상세페이지로 이동한다.
이 때 IOS내부적으로 어떻게 동작할까?
테이블 뷰는 ...dataSourem ...delegate 이 두 접미어를 가진 속성을 통해 델리게이트 오브젝트에 기능을 위임합니다.
*이 속성에 위임할 객체를 할당(Assign)하여 델리게이트 지정
델리게이트에서는 메서드를 미리 구현해 두어야 하고,
특정시점에 호출되는 메서드는 프로토콜로 선언 되어 있다.
반드시 프로토콜에 선언되어 있는 대로 메서드를 구현해야 한다.
필요한 시점에 우리가 직접 호출하는 것이 아니라 객체에서 이벤트가
발생하면 델리게이트 객체에 이벤트 메서드가 호출하는 메서드가 있는지 확인하고 호출한다.
구현 되어 있지 않다면 이벤트를 무시하거나, 경우에 따라 크래쉬가 발생하기도 한다.
테이블 뷰에서 컨트롤 + 드래그로 뷰컨트롤러를 데이터 소스와 델리게이트 둘 다 지정해준다.
연결한 델리게이트 객체의 스크립트에 extension으로 프로토콜을 채택(adapt)하여 ...datasource와 ...Delgate 클래스를 통해 테이블 뷰가 보여 줘야할 데이터와 실행할 메소드를 완성 시켜준다.
개발의 유연성이 증가한다.
앱마다 테이블 뷰의 디자인이 모두 다른데 만약
델리게이트 객체에 메소드를 위탁하지 않는다면
앱에서 사용할 디자인을 모두 예측해서
테이블 뷰 클래스에 미리 구현 해두어 한다.
매우 소모적인 작업 정도가 아니라 불가능하다.
델리게이트 패턴을 구성하면 테이블 뷰는 Cell디자인을 신경 쓸 필요가 없다.
셀 구성을 위임받은 델리게이트가 원하는 데이터와 디자인으로 셀을 구성 하여 테이블 뷰에 리턴을 해주면 테이블 뷰는 단순히 리턴된 화면만 출력해주기 때문이다.
마찬가지로 사용자의 이벤트에 따라 테이블 뷰 클래스 내부에 모든 경우의 수를 구현하기는 불가능하다. 테이블 뷰에서는 이벤트의 유무만을 전달해주는 것이 효율적이다.