[iOS] 커플링과 델리게이트 패턴

RudinP·2024년 2월 26일
0

Study

목록 보기
181/227
post-thumbnail

커플링

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

profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글