티스토리 뷰
안녕하세요 Hani입니다.
BaseViewController를 어떻게 만들까 고민한 결과를 적어볼까 해요. ☺️
class ViewController<T: BaseViewModel>: UIViewController {
let viewModel: T
private var cancellables = Set<AnyCancellable>()
init(viewModel: T) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
init?(coder: NSCoder, viewModel: T) {
self.viewModel = viewModel
super.init(coder: coder)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func bindViewModel()
}
BaseViewModel 프로토콜을 Generic Constraint로 지정해서
꼭 외부에서 BaseViewModel를 준수하는 뷰모델을 주입해야 하도록 만들었습니다.
하지만 ViewController를 상속받는 뷰컨트롤러에서 bindViewModel을 강제로 Override하도록 만들 수 없습니다.
typealias BaseViewController<T> = ViewController<T> & BindViewModelProtocol where T: BaseViewModel
protocol BindViewModelProtocol {
func bindViewModel()
}
class ViewController<T: BaseViewModel>: UIViewController {
let viewModel: T
private var cancellables = Set<AnyCancellable>()
init(viewModel: T) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
init?(coder: NSCoder, viewModel: T) {
self.viewModel = viewModel
super.init(coder: coder)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
bindViewModel을 서브클래스에서 반드시 구현하도록 만들기 위해서 Typealias를 사용했습니다.
Typealias로 ViewController를 상속, BindViewModelProtocol을 채택하도록 만들어야 하는데
ViewController이 Generic으로 구성되어 있기 때문에
Generic Typealias로 구현해봤어용.
References
https://github.com/apple/swift-evolution/blob/main/proposals/0048-generic-typealias.md
'Swift' 카테고리의 다른 글
[Swift] Property Wrapper로 translatesAutoresizingMaskIntoConstraints = false 강제하기 (0) | 2021.12.31 |
---|---|
[스위프트] map, compactMap, flatMap 차이 (0) | 2021.09.04 |
[스위프트] CaseIterable 프로토콜 / AllCases allCases 차이 (0) | 2021.08.28 |
[스위프트] Collection 프로토콜 (0) | 2021.08.28 |
[스위프트] lazy 지연 저장 프로퍼티 (3) | 2021.08.17 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 강한 순환 참조
- CPU와 Memory
- rxswift
- mach-o
- 최대 매칭
- State Restoration
- 코딩대회
- 최단경로 알고리즘
- Testable
- 네트워크 플로우
- WWDC16
- 최단경로문제
- observeOn
- CompositionalLayout
- WWDC17
- HIG
- 에드몬드 카프 알고리즘
- 컴퓨터 추상화
- MeTal
- WWDC21
- 벨만포드 알고리즘
- test coverage
- 다익스트라 시간복잡도
- 포드 풀커슨 알고리즘
- IOS
- 부스트캠프 6기
- 최단경로 문제
- WWDC19
- 네트워크 유량
- 벨만포드 시간복잡도
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함