๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_20180402 ~ 20180408

|

2018.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๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

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๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Comments