์๋
ํ์ธ์, ํ๋ผ์
๋๋ค.
์ด๋ฒ ๊ธ์ ์ ๋ฆฌํํ๋ก ์์ฑํด๋์ด ์ดํฌ๊ฐ ์กฐ๊ธ ๋ฑ๋ฑํ ์ ์์ต๋๋ค.. ์ดํด๋ถํ๋๋ ค์ ๐ฅฒ
์ด๋ฒ ๊ธ์ ์ดํฌ๋ ๋ฑ๋ฑํ๊ณ ์ค๊ธ ํ์์ด๋ค. ๋๋ฌด ์ด๋ ต๊ฒ ์๊ฐํ ํ์๊ฐ ์๋ ๊ฐ๋ ์ด๋ค. ๋จ์ํ๊ฒ ๋ง์๋ณด์.
์์ฝ
- ํ๋กํ ์ฝ์์ ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ Placeholder์ ๋๋์ด๋ค.
- Associated Type์ ์๋ typealias์๋๋ฐ, Swift 2.2๋ถํฐ Associated Type์ด๋ ํค์๋๋ก ๋ฐ๋์๋ค.
์ค๋ช
์์ ๋ ๊ฐ์ง ๊ด์ ์์ ๋ณด๋ฉด ๋ด์ฉ์ ํฌ๊ฒ ์ด๋ ต์ง ์๋ค. ์๋์ ์์๋ก ํจ๊ป ์ดํดํด๋ณด๊ฒ ๋ค.
์ฐ์ ํ๋ก์ ํธ์ ๋ํด ์ ๊น ์ดํดํด๋ณด๋ฉด, ํ๋ก์ ํธ๋ ํ์ฌ MVVM ํจํด์ ๋ฐ๋ฅด๊ณ ์๋ค. ๋ค์ ํ๋ก์ ํธ์์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ViewModel์ ๊ตฌํํด์ผ ํ๋ค. ๋ณดํต ๊ฐ ViewController๋ง๋ค ๋์๋์ด ๊ฐ๊ฐ์ ViewModel์ ํ๋์ฉ ๊ตฌํํ๊ณ , ViewController๋ ViewModel์ ์์ฑ์ผ๋ก ๊ฐ์ง๊ฒ ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ค๋ณด๋ฉด ๊ณตํต์ ์ผ๋ก ์๊ธฐ๋ ์์๋ค, ๋ฐ๋ณต๋๋ ์์ฑ์ด๋ ๋ฉ์๋๊ฐ ์์ํ ๋ฐ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํ๋กํ ์ฝ์ ํํ๋ก ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ ํ๊ฒ ์ ์ด์ฉํ๊ฒ ๋๋ฉด ์ฌ์ฌ์ฉ์ฑ์ด๋ ํ์ฅ์ฑ์ ๋งค์ฐ ์ฉ์ดํ๊ฒ ๋๋ค.
ํ๋ก์ ํธ์์ ViewModel์ด๋ผ๋ ๊ฒ์ ViewController๋ง๋ค ๊ฐ์ง๊ฒ ๋๊ณ , ViewModel๊ณผ View๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์์ ์ธ bindViewModel()์ ๊ณตํต์ ์ผ๋ก ์ํํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๊ณตํต๋๋ ์์ ์ ์ฐ๋ฆฌ๋ ํ๋กํ ์ฝ๋ก ๋ฌถ์ด์ ์์ ํ ๊ฒ์ด๋ค.
ํ๋กํ ์ฝ์๋ ํํ๋ง ์ก์๋๊ฒ ๋๋ค. ์ง์ ๊ตฌํ๊น์ง๋ ํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ํน์ ์ด ๋ถ๋ถ์ด ์ดํด๊ฐ ๋์ง ์๋๋ค๋ฉด ํ๋กํ ์ฝ์ ๋ํด์ ํ ๋ฒ ์ดํดํ๊ณ ์ค๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค. ๊ณ์ ์ด์ด๋๊ฐ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ViewModelBindableType ํ๋กํ ์ฝ์์๋ ๊ตฌํ๋์ด์ผ ํ viewModel ํ๋กํผํฐ์ bindViewModel ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค.
๊ทธ๋ฌ๋ ์๊ฐํด ๋ณผ ํฌ์ธํธ๊ฐ ํ๋ ์๋ค. ์ฐ๋ฆฌ๋ ViewModel์ ViewController์ ๋ฐ๋ผ ๊ณ์ํด์ ์๋ก ๋ง๋ค๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ViewModel์ Type ์ ๋ชจ๋ ๋ค๋ฅด๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํด์ผํ์ง? ์ฌ๊ธฐ์ ์ข์ ํด๊ฒฐ์ฑ ์ด ํ๋ ๋์จ๋ค. associatedType ์ ์ด์ฉํ๋ฉด ๋๋ค. ์์๋ก ํ์ ์ ์ ํด๋์ด์ viewModel์ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ typealias์ generic ๊ฐ๋ ์ด ๋ ์ค๋ฅธ๋ค.
๋ง์ฝ ํ๋กํผํฐ์ ํ์ ์ด ๋์ผํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๋ฅ ์ด๋ ๊ฒ ์์ฑํ๋ฉด ๋๋ค. ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋ name์ด๋ผ๋ ํ๋กํผํฐ๊ฐ ํญ์ String ํ์ ์ผ ๊ฒ์ด๋ผ๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ฉด ๋ ๊ฒ์ด๋ค.
protocol ViewContainer {
var name: String { get set }
}
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ํ์ ์ด ๋ฌ๋ผ์ง ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์ ๋ค์๊ณผ ๊ฐ์ด ํ์ ์ ์์๋ก ์ง์ ํด์ค ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ViewController์์ ViewModelBindableType์ ์ฑํํด์ ์ฌ์ฉํ ๋์ viewModel์ ํ์ ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํ์(MemoListViewModel, MemoDetailViewModel ๋ฑ)์ผ๋ก ์ง์ ํด์ค ์ ์๋ค.
// ViewModelBindableType.swift (ํ๋กํ ์ฝ)
protocol ViewModelBindableType {
associatedtype ViewModelType
var viewModel: ViewModelType! { get set }
func bindViewModel()
}
// MemoListViewController.swift (๋ทฐ ์ปจํธ๋กค๋ฌ)
import UIKit
class MemoListViewController: UIViewController, ViewModelBindableType {
var viewModel: MemoListViewModel!
override func viewDidLoad() {
super.viewDidLoad()
}
func bindViewModel() {
}
}
// MemoDetailViewController.swift (๋ทฐ ์ปจํธ๋กค๋ฌ)
import UIKit
class MemoDetailViewController: UIViewController, ViewModelBindableType {
var viewModel: MemoDetailViewModel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func bindViewModel() {
}
}
// ์์ ์๋ ์ฝ๋์ typealias๋ฅผ ์ถ๊ฐํ ๊ฒ
import UIKit
class MemoDetailViewController: UIViewController, ViewModelBindableType {
typealias ViewModelType = MemoDetailViewModel
var viewModel: ViewModelType!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func bindViewModel() {
}
}
๋ง๋ฌด๋ฆฌ
์ด๋ ต๊ฒ ์๊ฐํ ํ์์๋ค. ๋ค๋ฅธ ์ ํ๋ ๋ค์ด์ฌ ์ ์์ผ๋ฏ๋ก ์ ํ์ ๋ฏธ๋ฆฌ๋ถํฐ ์ ํ์ง ์๋ ๊ฒ์ด๋ค. ์์์ ํ์ ์ ์ ํด๋๊ณ ํ๋กํ ์ฝ์ด ์ ์ฉ๋๋ ์๊ฐ ์ค์ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ด๋ค. ํ๋กํ ์ฝ์์ ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ์ด๋ผ๊ณ ๋ณด๋ฉด ๊ฐ๋จํ ๊ฒ ๊ฐ๋ค.
๋ ํผ๋ฐ์ค
https://zeddios.tistory.com/382
https://woongsios.tistory.com/97
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] ์๋ธ ํด๋์ฑ (6) | 2021.10.07 |
---|---|
[iOS] Delegate Pattern(๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด) ์์(1) - ์ด์ ํ๋ฉด์ผ๋ก ๋์ด์ค๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ๋ (4) | 2021.09.09 |
[iOS] Typealias, ํ์ ๋ณ์นญ ์ฌ์ฉํ๊ธฐ (3) | 2021.09.02 |
[iOS] ํ ์คํธ์ ํฌํจ๋์ด ์๋ HTMLํ๊ทธ ์ ๊ฑฐํ๊ธฐ (0) | 2021.08.28 |
[iOS] Convenience init(ํธ์ ์ด๋์ ๋ผ์ด์ ) (2) | 2021.08.22 |