티스토리 뷰
iOS 개발을 하다보면 자식객체에서 부모객체에게 메시지를 보내야 할때가 생긴다.
그럴땐 보통 delegate 패턴을 사용한다.
class MySampleDelegateParentsClass: MySampleDelegateChildClassDelegate {
var child: MySampleDelegateChildClass
init() {
self.child = MySampleDelegateChildClass()
self.child.delegate = self
}
func sendMessage(foo: String) {
print("recived: \(foo)")
}
}
protocol MySampleDelegateChildClassDelegate: AnyObject {
func sendMessage(foo: String)
}
class MySampleDelegateChildClass {
weak var delegate: MySampleDelegateChildClassDelegate?
func doSomething() {
print("do something")
self.delegate?.sendMessage(foo: "foo")
}
}
하지만 Delegate 패턴을 사용하지 않고 부모객체에 직접 접근해서 사용하면 되지 않을까? 라는 생각이 들 수 있다.
class MySampleParentsClass {
var child: MySampleChildClass?
func makeSampleChildObj() {
self.child = MySampleChildClass(parentsObj: self)
}
func reciveMessage(foo: String) {
print("received: \(foo)")
}
}
class MySampleChildClass {
weak var parentsObj: MySampleParentsClass // weak 로 잡아줘서 reference count를 늘리지 말자
init(parentsObj: MySampleParentsClass) {
self.parentsObj = parentsObj
}
func doSomething() {
self.parentsObj.reciveMessage(foo: "foo")
}
}
이 의문점을 해소하기 위해 직접 부모객체를 가지게 만들고 함수를 직접 호출하도록 만들었다.
이렇게 만들면 delegate 패턴을 사용한 첫번째의 예시와 다를게 없어지는 구조가 되는것일까?
1. delegate 패턴을 사용했을 경우
A. MySampleDelegateParentsClass 는 MySampleDelegateChildClassDelegate 이라는 protocol 을 채택하고 해당 프로토콜에서 명시되어있는 함수와 변수를 모두 구현해줘야한다.
B. MySampleDelegateParentsClass의 객체는 MySampleDelegateChildClass의 delegate 를 자신이 구현하도록 명시해주었다. ( self.child.delegate = self )
C. MySampleDelegateChildClass 의 객체는 MySampleDelegateChildClassDelegate라는 protocol만 알고 있으면 되고, MySampleDelegateParentsClass의 클래스는 알 필요가 없다.
D. MySampleDelegateChildClass 객체가 부모에게 어떤 메시지를 전달하고 싶다면, delegate 패턴을 통해 메시지를 전달한다.
2. 부모객체를 가지고 있을 경우
MySampleChild 객체는 이제 MySampleParentsClass 라는 Class를 알고 있어야한다.
A) 만약 MySampleParentsClass가 변경이 되거나, B) MySampleChildClass가 MySampleParentsClass가 아닌 다른 Class가 호출하게 된다면??
MySampleChildClass 가 수정이 필요하게 된다.
물론 delegate패턴 사용시에도 MySampleDelegateChildClassDelegate Protocol 이 변경이 된다면 MySampleDelegateChildClass가 수정 될 가능성이 있지만, 이 예제에서는 delegate패턴 사용시보다 변경의 여지가 더 크다고 볼 수 있을 것 같다.
결국 결합도의 차이라고 생각함...
'프로그래밍 > Swift' 카테고리의 다른 글
RxSwift를 이용해 클로저 지옥 탈출하기 (0) | 2022.05.22 |
---|---|
associatedtype을 이용해 protocol 만들기 (0) | 2021.02.23 |
Optional 과 == 연산자 (0) | 2020.11.16 |
- Total
- Today
- Yesterday
- arc
- Swift 니모닉
- flatMap
- iOS Mnemonic
- module map
- CI
- Tuist
- cd
- Gitlab Runner
- swift
- 니모닉
- widget extension
- Delegate
- XCode Cloud
- ios
- associated type
- SwiftUI
- RxSwift
- iOS wallet
- Objective-C
- cicd
- Fastlane
- Secure Enclave
- Protocol
- firebase distribution
- modulemap
- XCodeGen
- 순환참조
- iOS 니모닉
- isSecureTextEntry
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |