커플링
- A 클래스에서 B 클래스 객체를 필요로 하는 현상
- 커플링이 강하면 유지 보수에 좋지 않아 권장되지 않는 현상이다.
- 델리게이트 패턴을 사용하여 해소할 수 있다.
- 유연성, 이식성도 높아짐.
- 델리게이트의 내용만 다시 구현하고, 클래스를 재사용 할 수 있기 때문
델리게이트 패턴
- A 클래스에서 B 클래스의 데이터를 필요로 하게 된다면, A -> B로의 데이터 요청이 필요하기 때문에 이 상황에서는 B 클래스가 델리게이트가 된다.
- 즉, 요청을 하고자 하는 VC에서 delegate 속성의 객체를 생성하면 된다.
- 데이터 요청 시
dataSource
를, 이벤트를 처리하고자 하면 delegate
를 구현하면 된다. (이름)
weak var
로 구현한다.
- 공통적으로 요청할 때 사용되는 메소드는 프로토콜에 구현되어 있다.
프로토콜
- 구조체, 클래스, 열거형 모두 채용 가능
- 만약 클래스에서만 프로토콜을 채용하게 하고자 한다면, 프로토콜에
AnyObject
프로토콜을 채용하면 된다.
- 선언만, 구현은 X
- 프로토콜끼리도 상속 가능
- 인스턴스를 프로토콜 타입으로 저장도 가능
- 프로토콜을 준수하고 있는 클래스로 타입캐스팅도 가능
- 이름은 보통
...able
, ...ing
- 선택적 메소드를 작성하려면 앞에
optional
키워드를 붙이면 되지만, 이를 위해서는 objc 프로토콜로 변경해야한다.
- 기본적으로는 Swift Protocol인데, 이는 모든 메소드가 필수 메소드로만 구현된다.
- objc 프로토콜로 변경하려면 @objc 특성을 추가하면 된다.
- @가 붙은 것을 특성이라고 한다.
@objc optional func ~
@objc protocol ProtocolName {
propertyRequirements
methodRequirements
initializerRequirements
subscriptRequirements
}
JustToDo 델리게이트 구현 예제
- AddViewController에서 저장 버튼을 누를 시 테이블뷰인 ListViewController에게 내용을 저장하고 테이블뷰를 리로드하도록 요청하도록 delegate를 구현
1. 프로토콜 작성
- 메소드는 보통 호출하는 객체의 이름으로 한다.
- ex) tableView는 델리게이트 메소드 이름이 tableView
- 첫번째 파라미터로는 요청한 주체, 두번째 파라미터의 이름으로는 실행 행위
- 첫번째 파라미터는 언더바를 붙여준다.
- 만약 두번째 파라미터가 필요 없다면 메소드 이름 자체에 포함시킨다.
2. 요청하는 클래스에 델리게이트 객체 추가
- weak는 클래스 프로토콜에만 사용 가능하기 때문에 해당 프로토콜은 AnyObject 프로토콜을 채택하도록 만들어야한다.
3. 요청받는 클래스(델리게이트)에서 프로토콜 채택
- 이후 델리게이트 호출 시 필요한 내용을 구현
- 여기서 DidCancel 메소드는 필수가 아니므로 옵셔널로 수정해준다.
델리게이트 옵셔널 체이닝
- 델리게이트 메소드에
?
을 붙여 사용
- 해당 메소드가 구현되어있다면 실행되고, 아니면 실행되지 않는다.
4. 요청받는 클래스(델리게이트)에서 요청하는 클래스의 델리게이트 객체에 자신을 저장