๐บ๏ธMapMory๋ ์ง๋ ๊ธฐ๋ฐ ์ถ์ต ๊ธฐ๋ก ์ดํ๋ฆฌ์ผ์ด์
์
๋๋ค.
์ด๋ค ์ฅ์์์ ์ด๋ค ๊ฐ์ ์ ๋๊ผ๋์ง ํ
์คํธ๋ก ๊ธฐ๋ฐํ ๋ฟ๋ง ์๋๋ผ, ๊ฐ์ ๋ ๊ธฐ๋กํ ์ ์์ต๋๋ค!!
๐ฑ์ฃผ์ ๊ธฐ๋ฅ
- AppleMap์ ํตํ ์ง๋ ํํ
- ์์น, ์ฌ์ง, ํ ์คํธ๋ฅผ ํฌํจํ ์ฌ์ฉ์ ๊ธฐ๋ก ์ ์ฅ
- ์์น ๊ฒ์ ๊ธฐ๋ฅ
- ํ์ฌ ์์น ํ์ ๋ฐ ์ด๋
- ๋คํฌ ๋ชจ๋ ์ง์
๐ํต์ฌ ๊ธฐ์
MapKit
์ ํตํ ์ง๋ ํ์RealmSwift
๋ฅผ ํตํ ์ฌ์ฉ์ ์ ๋ ฅ ๋ฐ์ดํฐ ์ ์ฅ ๊ธฐ๋ฅ ๊ตฌํAlamofire
๋คํธ์ํฌ ํต์Custom Observable
+MVVM
์ ํตํReactive Programming
์๊ธ ์ ์ฉCoreLocation
์ ์ฌ์ฉํ ์ฌ์ฉ์ ํ์ฌ ์์น ํ์ธ ๊ตฌํPHPickerViewController
๋ฅผ ํ์ฉํ ์ฌ์ฉ์ ์ฌ์ง ์ ๋ ฅ ๊ตฌํFirebase Crashlytics
๋ฅผ ํ์ฉํ Run Time Error ์ถ์ ๋ฐ ๊ด๋ฆฌToast
๋ฅผ ์ฌ์ฉํ ์ฌ์ฉ์ Notification ๊ตฌํsystemColor
orAsset Color Set
์ ํ์ฉํ ๋คํฌ๋ชจ๋ ์ง์EmojiPicker
๋ฅผ ํตํ ์ด๋ชจ์ง ์ ๋ ฅ ๊ตฌํ
๐๊ฐ๋ฐ ํ๊ฒฝ
ver. 1.0 ๊ฐ๋ฐ ๊ธฐ๊ฐ: 2023.09.23. ~ 11.02.
์ถ์ ๋ฐ ์ ๋ฐ์ดํธ: 2023.11. 02. ~ ํ์ฌ
๊ฐ๋ฐ ์ธ์: 1์ธ
๊ฐ๋ฐ ์ธ์ด: Swift
Minimum Deployment: iOS 15.0+:UISheetPresentationController
โ๏ธ๊ธฐ์ ์คํ
- Framework:
UIKit
- Design Pattern:
MVVC
,Singleton
,Router Pattern
- Package Management:
SPM
,CocoaPods
- Library:
Alamofire
,realmSwift
,SnapKit
,Then
,Toast
,Firebase Cloud Messaging
,Firebase Crashlytics
,EmojiPicker
- Etc:
PHPickerViewController
- ์ด์ ๋ฐํ, branch ๋ถ๊ธฐ ๋ฐ ์์ ์ํ, Pull request๋ฅผ ํ์ฉํ ํ์ ๊ด๋ฆฌ ์งํ๋ฅผ ์งํ.
- ๋ทฐ์ ๋ทฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌ๋ฅผ ์ํด
MVVM
์ ์ ์ฉํ๊ณ , ๋์ ์ผ๋ก ๋ทฐ์ ๋ฐ์ ํ๊ธฐ ์ํด Custom Observable์ ๊ตฌํ. - ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ, Observable ํด๋์ค๋ ํ์ ์ ๋์ ํ๋ ์ญํ ์ ์ํํ๊ณ ๋ด๋ถ์ Value ๊ฐ์ ํ ๋นํ๋ฉด didSet์ ํตํด Closure๋ฅผ ์คํ์ํค๊ณ Closure๋ฅผ ํตํด ๋ทฐ์ ๊ทธ ๊ฐ์ ์ ๋ฌ ํ๋ ๊ตฌ์กฐ.
class Observable<T>{
private var notifier: ((T)->Void)?
var value: T {
didSet{
notifier?(value)
}
}
init(value: T) {
self.value = value
}
func bind(closure: @escaping (T)->Void){
self.notifier = closure
}
}
- Alamofire์ URLRequestConvertible Protocol์ ํตํด Router Pattern์ ๊ตฌํ.
- Router Pattern์ ํตํด API request๋ฅผ ์ถ์ํํ๋ฉด API ํธ์ถ๋น 1:1 ๋์ ํ์ง ์์๋ ๋์ด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ ์ ์ง ๋ณด์์ฑ์ ๋์ผ ์ ์๋ ์ฅ์ ์ด ์๋ค.
enum Router: URLRequestConvertible{
case ...
private var baseURL: URL{ switch self { ... } }
private var endPoint: String{ switch self { ... } }
var header: HTTPHeaders{ switch self { ... } }
var method: HTTPMethod{ switch self { ... } }
var query: [String: String]{ switch self { ... } }
func asURLRequest() throws -> URLRequest { ... }
}