Store - app
STEP 1 - 2
์งํ๊ธฐ๊ฐ(2019/12/4 ~ 2019/12/7)
๊ณต๋ถํ ๋ด์ฉ ๐จโ๐ป
-
intrinsicContentSize
์ฌ์ด์ฆ๋ฅผ ์ด์ฉํ ์ปจํ ํธ์ border ์ฌ์ด์ ๊ฐ๊ฒฉ์ ๋ฃ์ ์ ์๊ฒ ๊ตฌํoverride var intrinsicContentSize: CGSize { var contentSize = super.intrinsicContentSize contentSize.height += 10 contentSize.width += 10 return contentSize }
-
NSAttributeString
ํ์ต- strikethrough ์์ฑ์ ์ด์ฉํ ์ทจ์์ ๊ตฌํ
- https://www.hackingwithswift.com/articles/113/nsattributedstring-by-example ์์ ํ์ต
- NSAttributeString ์ ๊ตฌํํ๋ฉฐ, ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋ช ํํด์ง์ง ์์์, snapKit์ ์ฐธ๊ณ ํ์ฌ ๋น์ทํ ์ปจ๋ฒค์ ์ ์ ์งํ๊ฒ ๊ตฌํํด๋ณด์๋ค.
// ๋ฑ์ง ๊ตฌํ
let attributedText = NSMutableAttributedString(string: text)
attributedText.beauty
.fgColor(style.textColor)
.bgColor(style.bgColor)
.align(style.align)
.font(style.font)
label.attributedText = attributedText
// ์ทจ์์ ๊ตฌํ
let price = NSMutableAttributedString(string: price)
price.beauty.align(.center).strikethrough(1)
priceLabel.attributedText = price
-
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋น์ค๋ฅผ ์ถ์ํํ์ฌ ๊ตฌํ
- DummyData , StubService ํด๋์ค๋ฅผ ๊ตฌํํ์ฌ ์ถํ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๊ฒ ๊ตฌํ.
STEP3 - ์ปค์คํ ํค๋ ๋ทฐ ๊ตฌํ
์งํ๊ธฐ๊ฐ(2019/12/9 ~ 2019/12/10)
๊ณต๋ถํ ๋ด์ฉ๐จโ๐ป
-
CustomHeaderView ๊ตฌํ
BadgeView
์ฌ์ฌ์ฉ์ ์ํ ๊ตฌํ
-
Category
๋ณ๋ก ๋ค๋ฅธEndPoint
๊ตฌํ์ ์ํด ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ ์ฉํMulitEndPoint
๊ตฌํ-
EndPoint.swift
-
protocol EndPoint: URLRequestConvertible { var baseURL: URL { get } var method: HTTP.Method { get } var task: HTTP.Task { get } var headers: HTTP.Headers? { get } var sampleData: Data? { get } }
-
MultiEndPoint.swift
// MARK: - MultiEndPoint enum MultiEndPoint { case endPoint(EndPoint) var endPoint: EndPoint { switch self { case .endPoint(let endPoint): return endPoint } } } // MARK: - EndPoint extension MultiEndPoint: EndPoint { var baseURL: URL { return endPoint.baseURL } var method: HTTP.Method { return endPoint.method } var task: HTTP.Task { return endPoint.task } var headers: HTTP.Headers? { endPoint.headers } func asURLRequest() -> URLRequest { return endPoint.asURLRequest() } var sampleData: Data? { return endPoint.sampleData } }
-
-
DispatchGroup
, ์์๊ฐ ๋ณด์ฅ๋๊ฒ ๊ตฌํ-
DispatchQueue
๋ฅผ.serial
ํ๊ฒ ํ์ฌ, ๋น๋๊ธฐ์ ์ผ๋ก ์์ฒญ์ ํ๋ ์์๋ฅผ ๋ณด์ฅํ๊ฒ ๊ตฌํํ์๋ค. -
let dispatchGroup = DispatchGroup() let serialQueue = DispatchQueue(label: "store.fetch", qos: .default)
-
DispatchGroup
๋ฅผ ์ด์ฉํด์, ๋ชจ๋ Task๊ฐ ์๋ฃ๋๋ค์ completion์ 1๋ฒ๋ง ํธ์ถํ๊ฒ ๊ตฌํํ์๋ค. -
dispatchGroup.notify(queue: .global()) { completion(.success(stores)) }
-
ํผ๋๋ฐฑ ๐ง
์๋น์ค ์ฝ๋์ DummyMain ์ด๋ DummySoup ์ ์จ์ผ๋ง ํ๋์?
Dummy-๊ฐ ๋ถ์ผ๋ฉด ์ด๋ค ์ฉ๋์ผ๊น์?
์์๋ก ์ฐ๋๊ฑด์ง ์ ์์ ์ธ์ง ์ฝ๋๋ก ํ๋์ฝ๋ฉํ๊ธฐ ๋ณด๋ค๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ง ์์์์ ์ง์ ํด์ฃผ๋ ๊ฒ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ViewModel์ ์์กด์ฑ์ ์ฃผ์
ํด์ ํ
์คํธ ๊ฐ๋ฅํด์ง๋๊น์.
- ๋ฐ๋ ์ชฝ์ ์ถ์์ ์ผ๋ก ๋ฐ๋, ์ฃผ์ ํด์ฃผ๋ ์ชฝ์ด ๊ตฌ์ฒดํ์ ์ ๊ฒฐ์ ํด์ ์ฃผ์ ํ๊ฒ ๊ตฌํํด์ผ๋ค๊ณ ๋๊ผ๋ค.
STEP4 - Cocoa Pods
-
Cocoa Pods
- ํ๋ก์ ํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ค
- Swift/Objectieve - C ํ๋ก์ ํธ๋ฅผ ์ํ ์์กด์ฑ๊ด๋ฆฌ์
-
Dependency manager
- ์๋ํํฐ ์์กด์ฑ์ ์ฝ๊ฒ ๋ํ๊ฑฐ๋, ์ ๊ฑฐํ๊ฑฐ๋, ์ ๋ฐ์ดํธ๋ฅผ ์ฝ๊ฒ ํ ์ ์๊ฒ ๋ง๋๋ ๋๊ตฌ
- dependency manager makes it easy to add, remove, update and manage third-party dependencies used by your app.
-
Podfile
-
ํ๋ก์ ํธ๋ด์ ํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ ํ๊ฒ์ ์์กด์ฑ์ ๋ช ์ธ
-
Podfile.lock - pod install ์ ํด๋น ๋ฒ์ ์ ์ก์๋์ด ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ๋์ด๋ ๊ธฐ์กด ๋ฒ์ ์ ์ง๊ฐ๋ฅ
- Form
-
target 'MyApp' do use_frameworks! pod 'Alamofire', '~> 3.0' end
-
-
Target
- buildํ product์ product๋ฅผ build ํ๊ธฐ ์ํ instruction๋ค์ ํฌํจํ๋ค.
- Target ํ๋๋ ํ๋์ Project๋ง์ ๊ฐ์ง๋ค.
-
Project
- Source code, including header files and implementation files
- Libraries and frameworks, internal and external
- Resource files
- Image files
- Interface Builder (nib) files
-
workspace
- ํ๋ก์ ํธ ์ฌ๋ฌ๊ฐ๋ฅผ ํฌํจํ๋ ์์ ๊ณต๊ฐ
-
build configuration
- product ์ build ๊ณผ์ ์์ ์ํ๋์ผ๋ง ํ๋ ๊ฒ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ค.
- Build Setting + Build phase ๊ฐ ์์ ํด๋น๋๋ค.
- Build setting ์ setting title (ํ์ดํ) / definition (์ค์ ๊ฐ) ์ผ๋ก ๋๋๋ค.
-
scheme
- Build , test , Run ๋ฑ Target Product์ ํ ํ๋