안녕하세요, iOS 개발하는 루피입니다.
오늘은 Delegate 패턴 공식문서를 의역하고 정리해보겠습니다.
바로 시작하겠습니다.
이벤트를 Delegate를 통해 처리하기
Overview
앱에서 발생하는 이벤트를 Cocoa 객체와 상호작용하여 처리할 때, Delegate를 사용할 수 있습니다.
Delegate 프로토콜 채택하기
Cocoa API는 종종 Delegate 메서드가 포함된 프로토콜을 제공합니다.
예를 들어
사용자가 창 크기를 조정하는 이벤트를 발생하면, 해당 이벤트를 감지한 클래스(위임자)가 지정된 대리자의 메서드를 호출합니다. 이를 통해 앱이 이벤트에 어떻게 반응할지 커스텀할 수 있습니다.
예제는 NSWindowDelegate 프로토콜을 채택하고, 그 중 하나인 window(_:willUseFullScreenContentSize:) 메서드를 구현한 코드입니다
class MyDelegate: NSObject, NSWindowDelegate {
func window(_ window: NSWindow, willUseFullScreenContentSize proposedSize: NSSize) -> NSSize {
return proposedSize
}
}
위 코드는 창이 전체 화면 모드로 전활될 때 호출되며, 제안된 크기를 그대로 반환합니다.
Delegate가 존재하는지 확인하기
Cocoa의 Delegation 패턴에서는 Delegate가 반드시 인스턴스화될 필요는 없습니다. 이벤트에 응답할 필요가 없다면 대리자를 생성하지 않아도 됩니다. 하지만 객체의 대리자 메서드를 호출하기 전에, 해당 대리자가 nil이 아닌지 확인해야 합니다.
아래 예제는 NSWindow를 생성하고, optional chaining을 사용하여 Window의 Delegate가 존재하는지 확인한 후 Delegate에게 메시지를 보냅니다:
let myWindow = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 5120, height: 2880),
styleMask: .fullScreen,
backing: .buffered,
defer: false
)
myWindow.delegate = MyDelegate() // 대리자 설정
if let fullScreenSize = myWindow.delegate?.window(myWindow, willUseFullScreenContentSize: mySize) {
print(NSStringFromSize(fullScreenSize)) // 대리자가 반환한 값 출력
}
위 코드에서 myWindow.delegate?.window(...)는 optional chaining을 통해 Delegate가 nil이 아닌 경우에만 메서드를 호출합니다. 만약 Delegate가 nil이라면 메서드는 호출되지 않고 안전하게 실패합니다.
이를 통해 런타임 오류 없이 대리자의 존재 여부를 확인할 수 있습니다.
오늘도 화이팅입니다!
'iOS > Swift' 카테고리의 다른 글
| [Swift] ARC (0) | 2025.01.28 |
|---|---|
| [Swift] Delegate 패턴을 구현해 사용해 보자 (0) | 2025.01.17 |
| [Swift] 스위프트에서 KVO 사용하기 (0) | 2025.01.16 |
| [Swift] Singleton(싱글톤)을 이용해 공유 자원 관리 (0) | 2025.01.15 |
| [Swift] 함수형 프로그래밍(Functional Programming) 2/2 (0) | 2025.01.13 |