- ํ๋ฃจ์ ๋ชฉํ ํก์ฐ ํ์ ์ค์
- ์ค์ ํก์ฐ ํ์ ์ฒดํฌ
- ์บ๋ฆฐ๋, ์ฐจํธ๋ก ํก์ฐ ํ์ ์ถ์ด ํ์ธ
- ๊ธ์ฐ ๊ด๋ จ ๊ธฐ์ฌ ํ์
- ๋งค์ผ ๊ธ์ฐ ๋ ๋ ค ์๋ฆผ
- ์์ด ๋์
- SwiftUI
- MVVM - InOut ํจํด, Combine
- LinkPresentation
- Swift Charts
- Alamofire
- RealmSwift
- FSCalendar
ViewModel์์ enum์ผ๋ก Action ๋ถ๋ฆฌ
๐กย ๋ฌธ์ ์ํฉ:ย ์ฝ๋์ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด enum์ผ๋ก Action ๋ถ๋ฆฌ
- enum์ ์๋ก์ด ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์๋ก์ด ์ก์ ์ ์ถ๊ฐํ๊ธฐ ์ฌ์
- ๋ชจ๋ ์ก์ ์ ํ๋์ ์ด๊ฑฐํ์ผ๋ก ๊ด๋ฆฌํ์ฌ, ์ก์ ์ฒ๋ฆฌ์ ํ๋ฆ์ ๋ช ํํ๊ฒ ์ ์ง
๊ตฌํ๋ถ
extension HomeViewModel {
enum Action {
case addSmokeButtonTapped
case viewOnTask
}
func action(_ action: Action) {
switch action {
case .viewOnTask:
input.viewOnTask.send(())
case .addSmokeButtonTapped:
input.addSmokeButtonTapped.send(())
}
}
}์คํ๋ถ
viewModel.action(.viewOnTask)
viewModel.action(.addSmokeButtonTapped)ํ์ View์ ViewModel์ ์ ๋ฌํ์ฌ ์์ View ๋ฐ์ดํฐ ๋ณ๊ฒฝ
๐กย ๋ฌธ์ ์ํฉ: ํ์ ๋ทฐ์ ๋์ ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ๋ทฐ์ ์ ๋ฌํ์ฌ ์์ ๋ทฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ค ํ์ผ๋, ๊ฐ ๋ทฐ์ ๋ณ๋์ ViewModel์ ์์ฑํด ์ฃผ์ ํ๋ ์์ ๋ทฐ์ ๋ฐ์ดํฐ๊ฐ ๊ฐฑ์ ๋์ง ์๋ ๋ฌธ์ ๋ฐ์
- ์์ ๋ทฐ์ ViewModel์ ํ์ ๋ทฐ์๋ ์ฃผ์ ํ์ฌ ๊ณต์ ๋ ViewModel์ ๊ธฐ๋ฐ์ผ๋ก ํ์ ๋ทฐ์ ์ํ ๋ฐ ์ด๋ฒคํธ๊ฐ ์์ ๋ทฐ์ ์ ๋ฌ๋ ์ ์๋๋ก ๊ตฌ์ฑ
- Combine ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์ฌ ํ์ ๋ทฐ์์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋ทฐ์ ๋ฐ์๋๋๋ก ํจ
LinkPresentation ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ URL Link Preview๋ก ๋ฐ์ดํฐ ํ์
๐กย ๋ฌธ์ ์ํฉ: ๊ธ์ฐ ๊ด๋ จ ๊ธฐ์ฌ์ URL์ ์ ๊ณตํ ๋, ํด๋น ๊ธฐ์ฌ์ ์ด๋ฏธ์ง์ ์ ๋ชฉ์ ํฌํจํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ตฌํํด์ผ ํ๋ ์ํฉ
- LPMetadataProvider๋ฅผ ํตํด URL์ ๋ฉํ๋ฐ์ดํฐ(์ด๋ฏธ์ง, ์ ๋ชฉ ๋ฑ)๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ณ , ์ด๋ฅผ LPLinkView๋ก ์๊ฐํํ์ฌ ๋งํฌ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ ๊ณต
- ๊ธ์ฐ ๊ด๋ จ ๊ธฐ์ฌ์ ์ด๋ฏธ์ง์ ์ ๋ชฉ์ ์ฌ์ฉ์๊ฐ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์์
Localization์ ์ํ ์์ด ์ง์
๐กย ๋ฌธ์ ์ํฉ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ค์ ์ํ ๋ค๊ตญ์ด ์ง์ ํ์
- String Catalog๋ฅผ ํ์ฉํ์ฌ Localization์ ๊ตฌํ, ํ๊ตญ์ด์ ์์ด ๋์
- ์ฑ ๋ด์์ ์๋์ผ๋ก ์ธ์ด ์ ํ์ด ์ด๋ฃจ์ด์ง๋ฉฐ ์ฌ์ฉ์ ์ธ์ด ์ค์ ์ ๋ง์ถ ๋์ ํ ์คํธ ๋ณํ์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑ
- Key Mapping์ ํตํด ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ ์ผ๊ด๋ ์ธ์ด ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌ
