프로그래밍iOS 개발자

델리게이션 패턴은 Swift에서 어떻게 작동합니까? 델리게이트 구현 시 마주치는 잠재적인 문제점은 무엇이며, 준수해야 할 모범 사례는 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변

델리게이션 패턴은 Swift 생태계에서 중요한 패턴 중 하나로, 객체 간 이벤트 처리 책임을 전달하는 데 널리 사용됩니다. 델리게이션을 사용하면 클래스가 동작의 일부를 다른 객체(보통 프로토콜을 통해 지정된 델리게이트)에게 위임할 수 있습니다.

작동 메커니즘

  1. 델리게이트 메서드의 시그니처를 설명하는 프로토콜을 정의합니다.
  2. 클래스는 retain cycle을 피하기 위해 델리게이트 객체에 대한 weak 참조를 저장합니다.
  3. 클래스는 이벤트가 발생할 때 델리게이트 메서드를 호출합니다.

예제

protocol DataUpdateDelegate: AnyObject { func didUpdateData(_ data: String) } class DataProvider { weak var delegate: DataUpdateDelegate? func updateData() { // ... 데이터 업데이트 로직 delegate?.didUpdateData("New data") } } class ViewController: UIViewController, DataUpdateDelegate { func didUpdateData(_ data: String) { print("데이터가 업데이트되었습니다: \(data)") } }

특수점과 고려 사항

  • 델리게이트는 거의 항상 weak (또는 unowned)이어야 하여 retain cycle을 피해야 합니다.
  • 델리게이트 프로토콜은 일반적으로 weak 참조를 허용하기 위해 AnyObject에서 상속됩니다.
  • 가능한 경우 프로토콜의 선택적 메서드를 확장을 통해 사용하십시오.

함정 질문

가치 유형(struct)과 관련된 델리게이션을 어떻게 구현합니까?

답변: Swift에서는 델리게이트가 반드시 참조 유형(class 또는 AnyObject)이어야 하며, weak 참조는 참조 유형에서만 가능합니다. 델리게이트는 struct나 enum이 될 수 없으며, 그렇지 않으면 문제가 발생합니다: 컴파일러는 weak 속성 사용을 허용하지 않고, strong 참조는 retain cycle을 초래합니다.

// 오류! 델리게이트를 struct로 선언할 수 없습니다: 컴파일러가 weak로 만들도록 허용하지 않습니다 protocol StructDelegate { ... } struct MyStructDelegate: StructDelegate { ... } weak var delegate: StructDelegate? // 오류

주제에 대한 이해 부족으로 인한 실제 오류 사례


이야기

한 프로젝트에서 델리게이트 속성을 weak으로 표기하는 것을 잊었습니다. 이로 인해 view와 델리게이트 간에 retain cycle이 발생하여, 애플리케이션의 메모리가 점차 "부풀어" 오르며 30분 후에 크래시되었습니다.


이야기

델리게이트가 value type (struct)로 구현되어 있었으며, 클래스 대신 struct로 되어있었습니다. 델리게이트가 되어야 할 IBOutlet은 알림을 받지 못했습니다 — 연결이 전혀 이루어지지 않았습니다. 문제는 로그 분석과 디버깅을 통해서만 발견되었습니다.


이야기

프로젝트에서 델리게이트 프로토콜이 AnyObject에서 상속되지 않았고, 델리게이트 속성을 weak var로 선언했습니다. 이는 컴파일 오류로 이어졌으며, 팀은 이를 이해하고 수정하는 데 시간이 필요했습니다.