커플링

- 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. 요청받는 클래스(델리게이트)에서 요청하는 클래스의 델리게이트 객체에 자신을 저장
