커플링
![](https://velog.velcdn.com/images/rudin_/post/4a0416ac-c862-4a5e-bc74-c7d6e691a0dc/image.png)
- 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
- 첫번째 파라미터로는 요청한 주체, 두번째 파라미터의 이름으로는 실행 행위
- 첫번째 파라미터는 언더바를 붙여준다.
- 만약 두번째 파라미터가 필요 없다면 메소드 이름 자체에 포함시킨다.
![](https://velog.velcdn.com/images/rudin_/post/7e5594bf-a86a-4f11-8465-aef5a78cce64/image.png)
2. 요청하는 클래스에 델리게이트 객체 추가
![](https://velog.velcdn.com/images/rudin_/post/4ece7c1e-be53-4e99-9ee6-dee3ab610ce1/image.png)
- weak는 클래스 프로토콜에만 사용 가능하기 때문에 해당 프로토콜은 AnyObject 프로토콜을 채택하도록 만들어야한다.
![](https://velog.velcdn.com/images/rudin_/post/9c340ff1-a48f-4382-b7df-ecd11fc12acc/image.png)
![](https://velog.velcdn.com/images/rudin_/post/f3131218-4253-467c-b078-902ab79c861d/image.png)
3. 요청받는 클래스(델리게이트)에서 프로토콜 채택
- 이후 델리게이트 호출 시 필요한 내용을 구현
![](https://velog.velcdn.com/images/rudin_/post/6d1ea579-9a46-4582-88af-189a9b42305f/image.png)
- 여기서 DidCancel 메소드는 필수가 아니므로 옵셔널로 수정해준다.
![](https://velog.velcdn.com/images/rudin_/post/170ae64e-a6fa-41cd-a82c-e3af7fee81a5/image.png)
![](https://velog.velcdn.com/images/rudin_/post/e5e1cad5-94c9-4363-86f9-8d15849ebbbc/image.png)
델리게이트 옵셔널 체이닝
![](https://velog.velcdn.com/images/rudin_/post/7b393252-6da6-435c-9924-3a6a4a90016e/image.png)
- 델리게이트 메소드에
?
을 붙여 사용
- 해당 메소드가 구현되어있다면 실행되고, 아니면 실행되지 않는다.
4. 요청받는 클래스(델리게이트)에서 요청하는 클래스의 델리게이트 객체에 자신을 저장
![](https://velog.velcdn.com/images/rudin_/post/2e5cddae-ffb5-4487-8a2c-9b424d0522e3/image.png)