TIL_20180402 ~ 20180408
02 Apr 2018 | TIL2018.04.02
- ์ํ๊ธฐ step6 ํผ๋๋ฐฑ์ฒ๋ฆฌ
- (UIView)UIImageview: frame, bound, addSubVIew โฆ
- ์๋ฃ๊ตฌ๋งค ํ์คํ ๋ฆฌ๊ฐ ํ์๋ ๋ ์๊พธ ํ๋ฉด ์ค๊ฐ๋ถํฐ ํ์๋๋ ๋ฌธ์
- ์ด์ ์ ์ฑ์ ์คํํ์๋ ์ ์ฅ๋๋ ํ์คํ ๋ฆฌ๋ฐ์ดํฐ๊ฐ ์๊ณ , ๊ทธ ์๋ก ๊ตฌ๋งค๋ด์ญ์ด ์์ด๋ฉด์ x์ถ์ด ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ ค๋ฌ๋๊ฒ. ํ์ง๋ง ์ด์ ์ ์์นด์ด๋น๋ ํ์คํ ๋ฆฌ ๋ฐ์ดํฐ๋ view์ ํ์๋์ง์์์ ์ค๊ฐ๋ถํฐ ์๋ฃ์ ์์ดํ ์ด๋ฏธ์ง๊ฐ ์์ธ๊ฒ์ฒ๋ผ ๋ณด์ธ๊ฒ์
- viewDidLoad์์ ์ฒ์ ์ธํ ํ ๋ ํ์คํ ๋ฆฌ ์์นด์ด๋น๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์๋ ์๋ ๋ฐ์ดํฐ๋ค์ ๋ทฐ๋ก ํ์ํด์ฃผ๋ ์ธํ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ ๊ฒ๊ฐ๋ค
- ์๋ฃ ์ถ๊ฐ์ ์ฌ๊ณ 0๊ฐ์๋ ์์ดํ ์ ์ถ๊ฐํ ๋ stock์ด ์ ๋ฐ์ดํธ ๋์ง ์์ ๋ฌธ์ . 5๋จ๊ณ์์ ์๋ฃ๋ฅผ ๊ตฌ๋งคํ๊ฑฐ๋ ์ถ๊ฐํ๋ฉด์ ์ฌ๊ณ ์ํ๊ฐ ๋ฐ๋๋๋ง๋ค shelf update๋ฅผํด์ ์์๊ฐ ๋ฐ๋์ด์ ๋ฒํธ๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ updateํ๋ ๋์์ ๋ค ์์ด๋๋ฐ, ์ด๋ฌ๋ฉด์ 0๊ฐ์์ ์ ๋์ ๋๋ฆฌ ์ ๋ฐ์ดํธ๊ฐ ํ์(key๋ฅผ ์ถ๊ฐํด์ผํ๊ธฐ๋๋ฌธ์)ํ๋ฐ ์ด ๋์์ ์์ ๋ฒ๋ ค์ 0๊ฐ์ธ key๋ ์ถ๊ฐํด๋ ์ถ๊ฐ๋์ง์์๋๊ฒ
- ์๋ฃ๊ตฌ๋งค ํ์คํ ๋ฆฌ๊ฐ ํ์๋ ๋ ์๊พธ ํ๋ฉด ์ค๊ฐ๋ถํฐ ํ์๋๋ ๋ฌธ์
// Stock.swift
func addItem(_ item: Beverage) {
for set in self.inventory {
if var arr = self.inventory[ObjectIdentifier(type(of: item))] {
arr.append(item)
self.inventory[ObjectIdentifier(type(of: item))] = arr
break
} else if set.key != ObjectIdentifier(type(of: item)) {
let newItemSet = [ObjectIdentifier(type(of: item)) : [item]]
self.inventory = self.inventory.update(other: newItemSet)
// self.inventory ์ด ๋ถ๋ถ์ด ๋ฌธ์ ๋ถ๋ถ์ด์์. ์ถ๊ฐํด์ ํด์ ํด๊ฒฐ.
}
}
}
- ์ถ๊ฐ๋ก StockController์์๋ update๋์์ ์ถ๊ฐํด์คฌ๋ค. ```swift // StockController.swift func addItem(item: Beverage) { self.stock.addItem(item) self.history.addSupplyLog(item) self.shelf = shelf.update(newItems: self.stock.currentInventory()) }
// Shelf.Swift func update(newItems: [ObjectIdentifier: [Beverage]]) -> Shelf { return Shelf(items: newItems) }
- **์ด๋ ๊ฒํด์ ํด๊ฒฐ!** ํ๋๋ฐ ์ด๋ ๊ฒ ํ๋ฉด์ shelf๊ฐ ์
๋ฐ์ดํธ๊ฐ ๋๋ฉด์ newItems๋ก ๋์
๋๋ฆฌ๊ฐ ๋ฐ๋๊ณ , UIButton์ tag์์์ ์์๊ฐ ๋ง์ง์์. 1๋ฒ์ ๋๋ฅด๋ฉด 5๋ฒ ์๋ฃ๊ฐ ๋์ค๊ณ ...
- **์ฌ๊ณ ์๋ ์
๋ฐ์ดํธ ๋์ง๋ง (stock, inventory) ์๋ก์ด ๋์
๋๋ฆฌ set์ผ๋ก ๋์
๋๋ฆฌkey ์์๋ ๊ณ ์ ๋ ๊ฐ์ผ๋ก ๋จ๊ฒจ์ง๋๋ก! Shelf์ update()ํจ์๋ฅผ ๊ทธ๋ฅ ๊ณ ์ ๋ ์ด๊ธฐ๊ฐ์ Shelf()์ ๋๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๋๋ก ์์ !** ํ๋๋ฐ ์ธ์คํด์ค๋ฅผ ๊ตณ์ด ๋ง๋ค ํ์๋ ์์๊ฑฐ๊ฐ๊ณ StockController์์ shelf๋ง ์
๋ฐ์ดํธ ์ํ๋ฉด๋๋๊น ์ฝ๋๋ฅผ ์กฐ๊ธ ์๋ณผํ์๋ ์์ ๊ฒ ๊ฐ๋ค. ์ผ๋จ ํด๊ฒฐ!
```swift
// StockController.Swift
func addItem(item: Beverage) {
self.stock.addItem(item)
self.history.addSupplyLog(item)
}
// shelf๋ฅผ ์
๋ฐ์ดํธํ์ง ์์๋๋๋ฉด ๊ตณ์ด ์ฝ๋๋ฅผ ๋ฃ์ด์ค ํ์๊ฐ ์์ด์ ์ง์
// Shelf.swift
func update(newItems: [ObjectIdentifier: [Beverage]]) -> Shelf {
return Shelf()
}
// ํธ์ถํ๋๋ผ๋ ์์ ๊ทธ๋๋ก ๋ฆฌํด๋๋๋ก ๋ณ๊ฒฝ
2018.04.03
- ์ํ๊ธฐstep7 PR : UserMode๋ค์์ AdminModeVC๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌ์๋ชจ๋ ๋ฉ๋ด๋ฅผ ๋ถ๋ฆฌ(๋งจ ์ฒซ ํ๋ฉด์ ๋ฌด์กฐ๊ฑด UserMode, Container View Controller์์)
- ViewController์์ ๋ค๋ฅธ ViewController๋ก ๊ฐ์ ๋๊ฒจ์ค๋,
prepare(for segue:)
์ฌ์ฉ - AppDelegate -> VC1(Root viewController) -> VC2(presented)๊ด๊ณ์์, VC1์ด VC2์ ์์ฑ๊ฐ์ ๋๊ฒจ์ฃผ๋ ๊ตฌ์กฐ์ผ๋
- VC1์์
prepare()
๋ฉ์๋ ์ฌ์ฉ, VC2์ ์์ฑ๊ฐ(VC2์ ์์ฑ์ ์ต์ ๋)์ ํ ๋นํด์ค ์ ์๋ค. - ์ฌ๊ธฐ์ VC1์ด VC2 ํด๋์ค๋ฅผ ๋ง๋ ๋ค(ํน์ ์ด๊ธฐํํ๋ค)๊ณ ์๊ฐ ํ ์ ์๋๋ฐ, ์ด๋ณด๋ค๋ ์ฑ์ด ์คํ๋ ๋ ์ด๋ฏธ VC1๊ณผ VC2๊ฐ ๋ง๋ค์ด์ง๊ณ VC2๊ฐ ํธ์ถ๋์ด ํ๋ฉด์ ๋์์ง๋ ์์ ์ VC1์ด ์์ฑ๊ฐ์ ํ ๋นํด์ค๋ค(๋ฃ์ด์ค๋ค)๋ ์๋ฏธ๋ก ์ดํดํด์ผ ๋ง๋ค.
prepare()
๋ฉ์๋๊ฐ ๋์ํ๋ ํ๋ฆ์ VC1์ด ๋์์ง ์ํ์์ ๋๊ธฐํ๊ณ ์๋ค๊ฐ, identifier๊ฐ ๋ง๋ segue๊ฐ ํธ์ถ๋๋ฉด ์์ ์ ๋ฉ์๋ ๋ด์ ๊ตฌํ๋์ด์๋ ๋์์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. prepare์์ ๋์ํ๋ ์์ ์ button์ด๋ผ๊ณ ์ฐฉ๊ฐํ ์ ์๋๋ฐ, ์ด๋ ๊ฒ ์๊ฐํ๋ฉด ์ฝ๋ค.- button์ segue ํธ์ถํ๋ ๊ฒ์ผ๋ก๋ง ์ฐ๊ฒฐ -> segue๊ฐ ํธ์ถ๋๋ฉด ๋๊ธฐํ๊ณ ์๋ prepare๊ฐ ์์ ์ ๋์ ์คํ. ์ฌ๊ธฐ์ prepare()์ ์ ์๋ identifier๋ก ์ฌ๋ฐ๋ฅธ segue๋ฅผ ๊ตฌ๋ถํ๋ค.
- VC1์์
- ViewController์์ ๋ค๋ฅธ ViewController๋ก ๊ฐ์ ๋๊ฒจ์ค๋,
2018.04.04
- ์ํ๊ธฐ ํผ๋๋ฐฑ ์์
2018.04.05
- ์ด์์ step7ํผ๋๋ฐฑ ์ถ๊ฐํ๊ธฐ, prepare์ถ๊ฐ
- stpe8 ์งํํ๊ธฐ
- ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ ์ฐธ๊ณ ๋์์ - ์คํ ํฌ๋ ๊ฐ์
- ๊ทธ๋ํ ๊ทธ๋ฆด๋, ํ์ด ๊ทธ๋ฆฌ๋ ๋ฉ์๋ ๋์ํ๋๊ฑธ ์๋ฉด ์์์ , ์ผํฐ, ๋๋๋์ง์ , ๊ฐ๋?๋ฑ์, ์ ์ฒด ํ๋งค์์ ํด๋น ์๋ฃ๋ง ํ๋งคํ ์๋ก ๊ณ์ฐํด์ ์ขํ์ ๊ฐ๋๋ฅผ ๊ณ์ฐํ๊ณ , ์๊ณ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๋๊ฑธ ์์๋ก ์ก์์๋ ์ด์ ํ์ด์ ๋๋๋ ์ขํ๊ฐ ๊ทธ ๋ค์ ํ์ด์ ์์์ ์ผ๋ก ์ก์ผ๋ฉด(์ผํฐ๋ ์ด์ฐจํผ ๋ชจ๋ ๋์ผ) ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณผ์์์ง์์๊น?,,,
- mapValues!!
- compactMap
- reduce!
2018.04.06
- ์ํ๊ธฐ step8 ์ฝ์ด๊ทธ๋ํฝ์ค
- ํ์ด๊ทธ๋ํ ์กฐ๊ฐ ๊ทธ๋ฆฌ๋ ๋ถ๋ถ drawํจ์์ ์ผ๋จ ๋ค ๊ตฌํํด๋ณด๊ธฐ(for loop์ฐ์ง ์๊ณ )
endAngles: [Beverage: CGFloat]?
ํ์ฉ- ๊ด๋ จ ๋ด์ฉ ์คํ ํฌ๋ ๊ฐ์ ๋ฃ๊ธฐ
- ๋ฐ๋ณต๋ฌธ ์ถ๊ฐํด์ ๊ทธ๋ ธ๋๋ฐ ์ ์๋จโฆโฆ.์๊ณ ๋ณด๋ endAngles๊ฐ ๋ผ๋์ ๊ฐ์ด ์๋๋ผ ๊ฐ๋๊ฐ์ด์์..-_-
- ์๊ฐ๋๋ฉด reduce์ mapValues์ ๋ฆฌ
2018.04.08
- RxSwift๊ฐ ๊ถ๊ธํ์ฌ ReactiveX ๋ฅผ ๋จผ์ ์ฐพ์๋ณด๊ฒ๋์๋ค. (๋ง๊ธฐ์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ํจ!)
- ์ผ๋จ ReactiveX์ ์ค์ํ ํค์๋๋
Asynchronous
,๋ฐ์ํ(Reactive)
,์ต์ ๋ฒํจํด
,๋ฐ๋ณต์ ํจํด
,ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์ ๋์ธ ๊ฒ ๊ฐ๋ค. - ๊ณต์์ ์ผ๋ก ๋์์๋ ์ ์ ๋ An API for asynchronous programming with observable streams. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
- ์์ญํ์๋ฉด ReactiveX๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ํ๋ฆ๊ณผ ํจ๊ป ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ API์ด๋ฉฐ, ์ต์ ๋ฒํจํด, ๋ฐ๋ณต์ ํจํด, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก๋ถํฐ ๋์จ ์ต๊ณ ์ ์กฐํฉ.
- ๋ด๊ฐ ์ดํดํ ReactiveX: ๋น๋๊ธฐ๋ฐฉ์์ผ๋ก ๋ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ ๊ด์ฐฐํ๋ฉด์ ํน์ ํ ๋(์๋ฒ ํต์ ์ ํ์๋, ํฐ์น์ด๋ฒคํธ๊ฐ ์์ ๋, ํ ์คํธํ๋์ ํน์ ํค์๋๊ฐ ์ ๋ ฅ๋์๋)์ ๋ฐ์ํ์ฌ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์!!
- RxCocoa ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ๊ฒ๋ ์๋ค๊ณ ํ๋ค. ๋ป: iOS์ UI๋ค์ Rx๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ผ๋จ ReactiveX์ ์ค์ํ ํค์๋๋
Comments