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

TIL_20180409 ~ 20180413

|

2018.04.09

  • ์žํŒ๊ธฐ์•ฑ step8 PR..
  • ํŒŒ์ด๊ทธ๋ž˜ํ”„ ๊ณ„์‚ฐํ• ๋•Œ ๋ผ๋””์•ˆ๊ณต์‹์— ๋ผ๋””์•ˆ๊ฐ’์ด ์•„๋‹Œ ๊ฐ๋„๊ฐ’์„ ๋„ฃ์–ด์„œ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ํŒŒ์ด(๋ถ€์ฑ„๊ผด)๋ชจ์–‘์˜ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ ์„ฑ๊ณต
  • pipe operator๊ฐ•์˜: custom operator ์„ค์ •, ํด๋กœ์ €์™€ pipe operator๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ํ•จ์ˆ˜ํ˜•ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • mapValue
  • reduce
    let arr = [1,2,3,4,5,6,7,8,9,10]
    arr.count
    let runningSum = arr
      .reduce(into: []) { $0.append(($0.last ?? 0) + $1) }
    // [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
    runningSum.count
    
  • ์›์˜ ์ž์ทจ์— ์žˆ๋Š” ์ ์˜ ์œ„์น˜ ๊ตฌํ•˜๊ธฐ - ํŒŒ์ด๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆด ๋•Œ ํ•„์š”ํ–ˆ์Œ

2018.04.10 ~ 11

  • ์žํŒ๊ธฐ ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ
    • ํ”ผ๋“œ๋ฐฑ ์ฒ˜๋ฆฌ ์™„๋ฃŒ & step8 ๋จธ์ง€!
  • ์žํŒ๊ธฐ ๋งˆ์ง€๋ง‰๋‹จ๊ณ„ step9์‹œ์ž‘
  • ํŒŒ์ด๊ทธ๋ž˜ํ”„๋ฅผ ๋“œ๋ž˜๊ทธํ•ด์„œ ํฌ๊ธฐ๋ฅผ ๋‹ฌ๋ฆฌํ•˜๊ณ  ์ƒˆ๋กœ ๊ทธ๋ฆผ
    • ์ œ์Šค์ณ, ํ„ฐ์น˜์ด๋ฒคํŠธ ์ ์šฉ
  • ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋Š” color๋ฅผ ํ…Œ๋งˆ๋ณ„๋กœ enum์œผ๋กœ ์„ ์–ธํ•ด์„œ ๋งค๋ฒˆ ๋žœ๋ค์œผ๋กœ ์„ ํƒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •
    • enum๋‚ด์— ์†์„ฑ๊ณผ ํ•จ์ˆ˜ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•ด๋ด„

2018.04.12

  • ์นด๋“œ๊ฒŒ์ž„ ์‹œ์ž‘ step1
  • ์žํŒ๊ธฐ ๋งˆ์ง€๋ง‰๋‹จ๊ณ„ ์ด์Šˆ ์ •๋ฆฌํ•˜๊ธฐ https://github.com/jinios/swift-vendingmachineapp/issues/5
  • ์นด๋“œ๊ฒŒ์ž„ step1 ๋จธ์ง€

2018.04.13

  • ์นด๋“œ๊ฒŒ์ž„ step2 ์™„์„ฑ ๋ฐ PR๋ณด๋ƒ„
  • addSubView, removeFromSuperView()
  • UIResponder - motionEnded
  • ์ปค์Šคํ…€ ๋ทฐ ํด๋ž˜์Šค ๋งŒ๋“ค๊ณ  ์†์„ฑ ์ง€์ •ํ•˜๊ธฐ: ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šคํƒ€์ž…์˜ ๋ทฐ๋Š” ํ•ด๋‹น ์†์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉ๋ฐ›๊ฒŒ(?)๋จ
  • ์ฝ”๋“œ๋กœ ์ถ”๊ฐ€ํ•œ view์— ์†์„ฑ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” init(frame:)์— ์†์„ฑ์„ ์ง€์ •ํ•ด์ค˜์•ผํ•œ๋‹ค. (๊ด€๋ จํฌ์ŠคํŒ…!) ```swift override init(frame: CGRect) { // by code super.init(frame: frame) self.layer.cornerRadius = 5.0 self.clipsToBounds = true }

convenience init() { self.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) } ```

์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ• ๋•Œ ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ

|

์—„์ฒญ๋‚œ ๋งŽ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ์ผ๋‹จ ์ผํ•˜๋ฉด์„œ ์ƒ๊ฐํ•ด๋ณธ ๋ช‡ ๊ฐ€์ง€์˜ ์ƒํ™ฉ์„ ์ •๋ฆฌํ•˜๊ณ ์‹ถ์—ˆ๋‹ค.
์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋ฉด์„œ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ๋•Œ ํฌ๋ž˜์‹œ/ํ˜น์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ๋“ค์„ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด,

์ธํ„ฐ๋„ท์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ

  • ์ด๊ฑด ์‹ค์ œ๋กœ ํ™œ์„ฑํ™”๋˜์–ด์žˆ๋Š” ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ์•ฑ ๋‚ด์˜ ์˜ต์ €๋ฒ„๊ฐ€ ์žˆ์–ด์„œ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋œ ์ˆœ๊ฐ„ ์•Œ๋ฆผ์ด๋‚˜ block์•ก์…˜์ด ๋‚˜์˜ฌ ํ™•๋ฅ ์ด ํฌ์ง€๋งŒ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜๋Š” ์ˆœ๊ฐ„ ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด ๋ณ€ํ™”๋  ์ˆ˜๋„ ์žˆ๋‹ค.

ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ

  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ชป ๋‚ด๋ ค์ค˜์„œ ํ˜น์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ํŒŒ์‹ฑ์„ ์‹œ๋„ํ•ด์„œ ํฌ๋ž˜์‹œ ๋‚˜๋Š” ๊ฒฝ์šฐ
  • ๋ฐ์ดํ„ฐ ์ž์ฒด๋Š” ๋ฐ›์•„์™”์œผ๋ฏ€๋กœ http response ์ฝ”๋“œ๋„ ์ •์ƒ์ด๊ณ , request๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋น„๋™๊ธฐ ๋ธ”๋Ÿญ ๋‚ด์—์„œ๋„ successํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ http์š”์ฒญ๊ณผ ์‘๋‹ต ์ž์ฒด๋Š” ์ •์ƒ์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ๋ฐ ํŒŒ์‹ฑ์„ ์‹œ๋„ํ•ด์„œ ํฌ๋ž˜์‹œ๋‚˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

๋ฐ์ดํ„ฐ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ nil์ธ๋ฐ ์ ‘๊ทผํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ด๋ ค์™€์„œ ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑ๋˜์—ˆ์„๋•Œ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ nil์ธ ๊ฒฝ์šฐ๊ฐ€ ์ข€ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ์˜€๋Š”๋ฐ,
  • ๋ฐ์ดํ„ฐ์ž์ฒด๋Š” ์ž˜ ๋‚ด๋ ค์™€์„œ response์ฝ”๋“œ๋„ 200์ด์ง€๋งŒ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ nil์ด๊ธฐ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜๋ชป ๋‚ด๋ ค์˜จ ๊ฒฝ์šฐ์ด๋‹ค. ์ด๋•Œ๋Š” fail๋ธ”๋Ÿญ์—์„œ ์—๋Ÿฌ๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด ๊ฒฝ์šฐ์—” success๋ธ”๋Ÿญ์—์„œ ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์“ธ๋•Œ nil์ธ ๊ฒฝ์šฐ๋„ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค.
  • ์š”์•ฝ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ด๋ ค์™€์„œ object๋กœ ํŒŒ์‹ฑ๋œ ๊ฐ์ฒด๋‚ด์˜ item์ด nil์ด์–ด๋„ http response๋Š” ์ •์ƒ์ฝ”๋“œ๋กœ ๋‚ด๋ ค์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ fail๋ธ”๋Ÿญ์—์„œ ๊ฑธ๋Ÿฌ์ง€์ง€ ์•Š๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ์Œ. ๊ฐ์ฒด ๋‚ด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ž์ฒด์˜ ๊ฒ€์ฆ๋„ ํ•„์š”ํ•˜๋ฉฐ, ์ผ๋ฐ˜ fail๋ธ”๋Ÿญ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ์—๋Ÿฌ์™€ ๋™์ผํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€/๋ง์ง€๋Š” ์—ฌ๋Ÿฌ ํŒŒํŠธ(๊ธฐํš/์„œ๋ฒ„/ํด๋ผ)์™€ ๋…ผ์˜ํ•ด์„œ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๋“ฏ!

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

์•„์นด์ด๋น™, UserDefaults - ๊ฐ์ฒด ์ €์žฅ๋ฐฉ๋ฒ•

|

์•„์นด์ด๋น™: ๊ฐ์ฒด์˜ ์•„์นด์ด๋น™์ด๋ž€ ๊ทธ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๊ณ  ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๊ทธ ๋‚ด์šฉ์„ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป https://medium.com/@felicity.johnson.mail/core-data-vs-nskeyedarchiver-vs-user-defaults-e660d541bb6e

์•„์นด์ด๋ธŒ - NSCoding

  • ๊ฐ์ฒด ์•„์นด์ด๋ธŒ๋Š” ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๊ฐ€๋ณ€๊ฐ์ฒด๋‚˜ ๋‹ค์ค‘์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ์›๋ž˜๋Œ€๋กœ ๋ณต์›ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ NSCodingํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • NSCodingํ”„๋กœํ† ์ฝœ์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋””์ฝ”๋”ฉํ•˜๊ธฐ์œ„ํ•œ ๋‘๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋งŒ ์žˆ์Œ
  • func encode(with aCoder: NSCoder)
  • required init?(coder aDecoder: NSCoder)
  • NSCoderํด๋ž˜์Šค: ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์žˆ๋Š” ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ์œ„ํ•œ ์ถ”์ƒํด๋ž˜์Šค
    • ์‹ค์ œ๋กœ NSKeyedArchiver,NSKeyedUnarchiver, NSPortCoder์™€ ๊ฐ™์€ ํ•˜์œ„ ํด๋ž˜์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•จ
  • NSKeyedArchiver,NSKeyedUnarchiver: ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ• ๋•Œ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ‚ค๊ฐ’์„ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ด์„œ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • NSKeyedUnarchiver์˜ func containsValue(forKey key: String) -> Bool๋กœ ํ•ด๋‹น ํ‚ค์˜ ๋ฐ˜ํ™˜๊ฐ’์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ
class DataStorage<T> {

    class func load() -> T? {
        // ์กด์žฌํ™•์ธ
        if UserDefaults.standard.object(forKey: String(describing: T.self)) != nil {
            // key๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ด
            guard let encodedData = UserDefaults.standard.data(forKey: String(describing: T.self)) else { return nil }
            guard let archivedMachine = NSKeyedUnarchiver.unarchiveObject(with: encodedData) as? FavoriteList else { return nil }
            return archivedMachine as? T
        }
        return nil
    }

    class func save(data: T) {
        UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: data), forKey: String(describing: T.self))
    }
}

์•„์นด์ด๋น™

  • iOS์•ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ๋ชจ๋ธ ๊ฐ์ฒด: ์‚ฌ์šฉ์ž๊ฐ€ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์—ญํ•  (์ €์žฅ๊ณผ ๋กœ๋”ฉ)
    • ๋ทฐ ๊ฐ์ฒด: ๋‹จ์ˆœํžˆ ๊ทธ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜
    • ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด: ๋ทฐ์™€ ๋ชจ๋ธ ๊ฐ์ฒด์˜ ๋™๊ธฐํ™” ์ฑ…์ž„
  • ์•„์นด์ด๋น™์€ iOS์—์„œ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ํ”ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž„
  • ์•„์นด์ด๋น™: ๊ฐ์ฒด์˜ ์•„์นด์ด๋น™์ด๋ž€ ๊ทธ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๊ณ  ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๊ทธ ๋‚ด์šฉ์„ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป
  • ์–ธ์•„์นด์ด๋น™: ์•„์นด์ด๋ธŒํ•œ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ ๋‹ค.

  • (์ฐธ๊ณ )
    • ์Šคํ† ๋ฆฌ๋ณด๋“œ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ• ๋•Œ ๊ฐ์ฒด๋“ค์€ ์•„์นด์ด๋น™ ๋œ๋‹ค.
    • ์‹คํ–‰ ์ค‘์— ๊ฐ์ฒด๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ์—์„œ ์–ธ์•„์นด์ด๋น™๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋œ๋‹ค.
    • UIView์™€ UIVIewController๋“ค์€ ๋ชจ๋‘ NSCoding ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅธ๋‹ค.

NSCoding

  • ์•„์นด์ด๋น™/์–ธ์•„์นด์ด๋น™ ํ•  ํด๋ž˜์Šค๋“ค์€ ๋ฐ˜๋“œ์‹œ NSCodingํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ผ์•ผํ•œ๋‹ค.
  • ์–ด๋–ค ๊ฐ์ฒด์˜ ์†์„ฑ์ด ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด, ๊ทธ ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด...์ฒ˜๋Ÿผ ์ˆ˜์ง๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๊ตฌ์กฐ๋ผ๋ฉด NSCoding์ด ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋Š” ์Šค์œ„ํ”„ํŠธ๊ธฐ๋ณธ value type ๋‹จ๊ณ„๊นŒ์ง€ NSCodingํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.
  • ๋งŒ์•ฝ ์•„์นด์ด๋น™ ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ˆ˜์ง๊ตฌ์กฐ ๋‚ด์— ์œ„์น˜ํ•ด์„œ ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ์ผ๋ถ€ ์†์„ฑ(๊ฐ์ฒด)์€ NSCodingํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜์ง€๋งŒ ๋ฉ”์†Œ๋“œ ์„ ์–ธ๋งŒ ํ•ด๋†“๊ณ  ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
class Robot: NSCoding {
 var name : String = ""
 var nemesis : Robot
 var model : Int

 func encode(with aCoder: NSCoder) {
   aCoder.encode(name, forKey: "name")
   aCoder.encode(nemesis, forKey: "nemesis")
   aCoder.encode(model, forKey: "model")
 }
 // ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์ธ์ž๋กœ ์ „๋‹ฌ๋œ NSCoder๊ฐ์ฒด ์•ˆ์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ธ์ฝ”๋”ฉํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์€ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ํŒŒ์ผ์‹œ์Šคํ…œ์— ์ €์žฅ๋œ๋‹ค.

 required init?(coder aDecoder: NSCoder) {
   name = aDecoder.decodeObject(forKey: "name") as! String
   nemesis = aDecoder.decodeObject(forKey: "nemesis") as! Robot?
   model = aDecoder.decodeInteger(forKey: โ€œmodel")
 }
}
  • aCoder.encode(์ €์žฅํ•  ๊ฐ์ฒด์†์„ฑ, forKey: "์ธ์ฝ”๋”ฉ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‹๋ณ„ํ•  ํ‚ค๊ฐ’์ด ๋  ๋ฌธ์ž์—ด")
  • ์•„์นด์ด๋ธŒ์—์„œ ์–ธ์•„์นด์ด๋ธŒ๋˜๋ฉด์„œ ๋กœ๋“œ๋˜๋Š” ๊ฐ์ฒด๋“ค์€ init(coder:)๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” encode(with:)์—์„œ ์ธ์ฝ”๋”ฉ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์™€ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ํ• ๋‹นํ•ด์•ผํ•œ๋‹ค.

UserDefaults

  • key-value ์Œ์œผ๋กœ ๋””๋ฐ”์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  • ์ฃผ๋กœ ์•ฑ์˜ ์„ค์ •๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ์ฝ๊ธฐ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋จ
  • ์Šค์œ„ํ”„ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฉด ๋ณ„๋„์˜ ์ž‘์—… ์—†์ด ์ €์žฅ
    • float, double, integer ๋ฐ boolean๊ณผ ๊ฐ™์€ ๊ณตํ†ต ์œ ํ˜•์— ์•ก์„ธ์Šคํ•˜๊ธฐ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•  ๋ฟ๋งŒ์•„๋‹ˆ๋ผ,
    • NSData, NSString, NSNumber, NSDate, NSArray ๋˜๋Š” NSDictionary ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Œ!
    • (๋‹ค๋ฅธ ๊ฐ์ฒด ์œ ํ˜•์˜ ๊ฒฝ์šฐ NSKeyedArchiver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•ด์•ผํ•จ)

ํ™•์žฅ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•

  • UserDefaults๋Š” ์ €์žฅํ•œ value์— Stringํƒ€์ž… key๋กœ ์ ‘๊ทผํ•ด์•ผํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ๋•Œ๋ฌธ์—, ์˜คํƒ€๊ฐ€ ๋‚˜๊ฑฐ๋‚˜ ํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•ด ๋Ÿฐํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. enum์„ ์‚ฌ์šฉํ•ด์„œ ์‹ค์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ extension์„ ์‚ฌ์šฉํ•ด์„œ ์ข€ ๋” ์Šค์œ„ํ”„ํŠธ๋‹ต๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. (๋‚˜์ค‘์— ์จ๋ด์•ผ์ง€..ใ…‹ใ…‹ใ…‹)
  • ์ฐธ๊ณ ๋งํฌ - extension๊ตฌํ˜„ํ•ด์„œ UserDefaults์‚ฌ์šฉํ•˜๊ธฐ

์ฐธ๊ณ ์ž๋ฃŒ

TIL_20180326 ~ 20180331

|

2018.03.26

  • ์žํŒ๊ธฐ 3๋‹จ๊ณ„ ์Šคํ…
    • UserDefaults
    • ์•„์นด์ด๋น™๊ตฌํ˜„: NSCoding
      • NSCodingํ”„๋กœํ† ์ฝœ์„ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ History๋ฅผ class๋กœ ๋ณ€๊ฒฝํ•จ
      • encoding์ด ํ•„์š”์—†๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ผ๋ฉด NSCoding ํ”„๋กœํ† ์ฝœ ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š์•„๋„ ๋จ. (๋””๋ฒ„๊ทธ๋กœ ์ฐ์–ด๋ณด๋ฉด encoding์‹œ๋„๋ฅผ ํ•˜์ง€๋งŒ ๋นˆ ๊ฐ’๋งŒ ๋“ค์–ด๊ฐ€๋Š”๋“ฏ)
  • escaping closure?
  • ์ƒ์† - super.init() : ์Šค์œ„ํ”„ํŠธ์˜ ์ƒ์†๊ด€๊ณ„๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  super.init()์„ ๋ฐ˜๋“œ์‹œ ์™„๋ฃŒํ•ด์•ผ
  • joined() - flatten: [[Beverage]] ์ด์ค‘๋ฐฐ์—ด์„ reduce()๋ฅผ ํ†ตํ•ด ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋งŒ๋“ค๋ ค๊ณ ํ•˜๋‹ˆ๊นŒ ์ ‘๊ทผ์ด ์•ˆ๋จ (ambiguous ์—๋Ÿฌ) joined()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ผ๋ฐ˜ 1์ฐจ์›๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  reduce()์ ์šฉํ•จ

2018.03.27

  • ์–ด์ œ ํ•œ ๋ถ€๋ถ„ ์ •๋ฆฌ: joined() / flatmap, reduce
    • joined()
      • sequence๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฝœ๋ ‰์…˜์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ
      • ์ˆœ์„œ๋Œ€๋กœ, ์—ฐ์†๋˜๊ฒŒ ์ด์–ด์ง„ ์ฝœ๋ ‰์…˜ ๋ฆฌํ„ด
      • ๋‹ค์ˆ˜์˜ ์ฝœ๋ ‰์…˜์˜ element๋“ค์„ ์—ฐ์†์œผ๋กœ ์ด์–ด์คŒ(?): ์ด์ค‘๋ฐฐ์—ด.joined()๋ฅผ ํ–ˆ๋”๋‹ˆ 1์ฐจ์›๋ฐฐ์—ด๋กœ ๋ฆฌํ„ด๋๋Š”๋ฐ, FlattenBidirectionalCollection<Array<Element>>๊ฐ€ ๋ฆฌํ„ด๋จ.
      • FlattenBidirectionalCollection - Supporting types
  • ์ƒ์†!!!
  • ์•„์นด์ด๋น™ ์ธ์ฝ”๋”ฉ ๋””์ฝ”๋”ฉ ํ•œ ๋ถ€๋ถ„์—์„œ forced unwrapping์—†์• ๊ธฐ
  • DIP ์˜์กด์„ฑ, ์˜์กด์„ฑ์—ญ์ „
  • ์‹ฑ๊ธ€ํ†ค
  • init(): ์ง€์ •์ƒ์„ฑ์ž ๋‚ด์—์„œ ์ง€์ •์ƒ์„ฑ์ž๋ฅผ ๋˜ ํ˜ธ์ถœํ•˜๋ฉด ์ฐธ์กฐ ์—๋Ÿฌ ๋ฐœ์ƒ: ์•„๋ž˜ ์˜ˆ์‹œ์ฝ”๋“œ
class VendingMachine: NSObject, NSCoding {
    static var sharedInstance = VendingMachine()

    private override init() {
        super.init()
        VendingMachine.sharedInstance = VendingMachine(stockItems: Controller().setVendingMachineStock(unit: 1))
    }
  • Override: NSObject์ƒ์†๋•Œ๋ฌธ์— ํ‚ค์›Œ๋“œ ํ•„์š”, super.init()๋„
  • super.init(): ์Šค์œ„ํ”„ํŠธ ์ƒ์†์—์„œ ์„œ๋ธŒํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™”๋Š” ๋ณดํ†ต ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋‹ค ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— super.init()์„ ํ•ด์ฃผ๋ฉด ์ƒ์† ๊ด€๊ณ„์—์„œ ๋‚˜ ์ž์‹ (์„œ๋ธŒ)๊ณผ ์Šˆํผ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋๋‚˜๊ณ  ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ๋‹ค.
  • sharedInstance๋ณ€์ˆ˜์— VendingMachine()์˜ ์ดˆ๊ธฐํ™”๋ฉ”์„œ๋“œ(private override init())๋ฅผ ํ†ตํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ค‘์—, (locking์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ธ๊ฒƒ๊ฐ™์Œ) ๊ทธ init()์•ˆ์—์„œ VendingMachine.sharedInstance = VendingMachine(stockItems: Controller().setVendingMachineStock(unit: 1))ํ•˜๋ฉด์„œ VendingMachine์˜ ์ง€์ •์ƒ์„ฑ์ž init(stockItems:)๊ฐ€ ํ˜ธ์ถœ๋˜๋‹ˆ๊นŒ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋“ฏ. (์—๋Ÿฌ๋ฉ”์‹œ์ง€: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0))

2018.03.28

  • ์‹ฑ๊ธ€ํ†ค๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ณ  ์•„์นด์ด๋น™ ์•ˆ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ณ  ์žํŒ๊ธฐ step4 PR
  • ์‹ฑ๊ธ€ํ†ค๊ณผ ์•„์นด์ด๋น™ ๋ฌธ์ œ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ• ์ •๋ฆฌ
  • ์žํŒ๊ธฐ step4 ๋จธ์ง€~!
  • ์˜ต์ €๋ฒ„ํŒจํ„ด ๊ธฐ์ดˆ์ ์ธ ๊ฒƒ ์กฐ์‚ฌํ•จ
    • keyword: addObserver, postNotification

2018.03.29

  • ์งˆ๋ฌธ๊ฑฐ๋ฆฌ: ํƒ€์ž…๋ฉ”์†Œ๋“œ์˜ ์œ ํšจ ์‹œ์ , ์–ด๋–ค ๊ฒƒ ์ƒ์„ฑ ํ›„๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ •ํ™•ํ•œ ๋œป
  • ์•ฑ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ณ€์ˆ˜ ์ƒ์„ฑ์‹œ์ ๊ณผ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ viewDidLoad์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ๋•Œ์˜ ์‹œ์  ์ฐจ์ด. appDelegate์—์„œ๋Š” ๋กœ๋“œ๋  ์žํŒ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋กœ ์‹ฑ๊ธ€ํ†ค๊ฐ์ฒด๋ฅผ ๋ฐ”๊ฟ”์คฌ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ viewDidLoad์—์„œ ์ ‘๊ทผํ•œ appDelegate๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐ ๋นˆ ์žํŒ๊ธฐ ๊ฐ’์ด์—ˆ์Œ.

  • ์‹ฑ๊ธ€ํ†ค ์ ์šฉํ•˜๋ฉด์„œ ์ฒซ๋ฒˆ์งธ ์ฝ”๋ฉ˜ํŠธ์งˆ๋ฌธ๊ฑฐ๋ฆฌ JKโ€™s comment: ์œ„์—์„œ sharedInstance๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์•„๋ž˜ DataStorage์—์„œ loadํ•ด์„œ self.vending ๋งŒ ๋ฐ”๊พธ๋ฉด ๋‹ค๋ฅธ ๊ณณ์—์„œ sharedInstance์— ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋˜์ง€ ์•Š๋‚˜์š”? ์‹ฑ๊ธ€ํ†ค ์˜๋ฏธ๊ฐ€ ์žˆ๋‚˜์š”?
  • ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ ‘๊ทผ ํ•œ๋‹ค: ์‹ฑ๊ธ€ํ†คํŒจํ„ด์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ธ๋ฐ, AppDelegate๊ฐ์ฒด(์™ธ๋ถ€)์—์„œ VendingMachine.sharedInstance = loadData์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ’์„ ์ง์ ‘ ๋ฐ”๊พธ๋Š”๊ฒƒ์ด ๋ฌธ์ œ?

  • ํ•˜์ง€๋งŒ static์ด๋ผ๋Š”๋œป์€ ์ „์—ญ๋ณ€์ˆ˜, ๋ชจ๋“  ๊ฐ์ฒด๋“ค์ด ๊ทธ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ(?)๋งŒ๋“ค์–ด๋†“๊ณ  ์ •์ž‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป์ด๋ž€?ใ… ใ… 
  • ์ „์—ญ๋ณ€์ˆ˜ ์Šค์Šค๋กœ load๋œ ์žํŒ๊ธฐ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ appDelegate๊ฐ์ฒด์—์„œ ์„ ์–ธ๋œ self.vending = sharedInstance์˜ self.vending์„ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ๊ฒƒ์˜ ์ •ํ™•ํ•œ ์ฐจ์ด

TIL

  • ์˜ต์ €๋ฒ„ํŒจํ„ด ๊ตฌํ˜„

  • ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ• ๋•Œ sharedInstance๊ฐ€ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์ธ์ค„ ์•Œ๊ณ  ์กฐ๊ธˆ ํ—ค๋งธ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜๋ž‘ ๋˜‘๊ฐ™์ด ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ๊นŒ ์ดํ•ดํ•˜๊ธฐ ํŽธํ–ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์–ด๋””์— ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์ฐธ์กฐํ•ด๋†“๊ณ  ๋˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์— ์ฐธ์กฐํ•ด์„œ ์“ฐ๊ณ ์žˆ์œผ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์žํŒ๊ธฐ ๊ฐ์ฒด๋ฅผ ๋‘๊ฐœ ๋งŒ๋“ค๊ณ  ๋”ฐ๋กœ ์ž‘์—…ํ•˜๊ณ  ๋”ฐ๋กœ ์ €์žฅํ•˜๊ณ ์žˆ์—ˆ์Œ..
  • static๋ณ€์ˆ˜๋„ ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๋ณ€์ˆ˜์ผ๋ฟ์ด๋‹ค!
  • ์žํŒ๊ธฐ ์˜ต์ €๋ฒ„ํŒจํ„ด pr๋ณด๋ƒ„

2018.03.30

  • ์žํŒ๊ธฐ step5 ์˜ต์ €๋ฒ„ํŒจํ„ด ๊ตฌํ˜„์ค‘~_~
  • MVC๋ฅผ ์ž˜ ๋ถ„๋ฆฌํ•˜๊ณ  ์˜ต์ €๋ฒ„ํŒจํ„ด์ ์šฉํ•˜๋Š” ๊ตฌ์กฐ์งœ๊ธฐ
  • ์˜ต์ €๋ฒ„ ํŒจํ„ด ์—ฌ๋Ÿฌ ์˜ˆ์‹œ ์ฐพ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์กฐ์‚ฌ
  • AdminModeํ”„๋กœํ† ์ฝœ๊ณผ UserModeํ”„๋กœํ† ์ฝœ ๋‘˜๋‹ค ๋งŒ์กฑํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ๋งŒ๋“ค๊ธฐ
    • ํ˜„์žฌ๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‘ ๋ชจ๋“œ ๋‹ค ์„ž์—ฌ์žˆ๋Š” ๋ฐฉ์‹์ธ๋ฐ, ์ถ”ํ›„ admin๊ณผ UserMode๋ฅผ ๋ถ„๋ฆฌํ•œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ• ๊ฒƒ์ž„
    • AdminMode ์ „์šฉ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ํ”„๋กœํ† ์ฝœ
    • UserMode ์ „์šฉ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ ํ”„๋กœํ† ์ฝœ
    • ๋‘ ํ”„๋กœํ† ์ฝœ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ƒ์œ„ํ”„๋กœํ† ์ฝœ
    • ๊ทธ ์ƒ์œ„ ํ”„๋กœํ† ์ฝœ์„ ๋งŒ์กฑํ•˜๋Š” VendingMachine
    • ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์— ์žˆ๋Š” vendingMachine์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์ƒ์œ„ํ”„๋กœํ† ์ฝœํƒ€์ž…์œผ๋กœ ์„ ์–ธ
    • ์•ฑ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์—์„œ ์„ ํƒํ•œ ๋ชจ๋“œ์— ๋งž๋Š” ํ”„๋กœํ† ์ฝœ์„ VendingMachine์„ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ง€์ •ํ•ด์คŒ

2018.03.31

  • ๋ฌธ์ œ: ์žํŒ๊ธฐ ๊ตฌ๋งค๋™์ž‘์ด ์•„์˜ˆ ์•ˆ๋˜๋Š” ๋ฌธ์ œ
    • ์›์ธ: vending๋ถ€ํ„ฐ stockController, shelf๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ.
    • ํ•ด๊ฒฐ: shelf๊ฐ€ ์•„์นด์ด๋น™์ด ๋”ฐ๋กœ ์•ˆ๋จ. ๋””์ฝ”๋”ฉ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„์˜ˆ ๋น„์–ด์žˆ์—ˆ์Œ. ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์žํŒ๊ธฐ ์ง„์—ด ์ˆœ์„œ๋Œ€๋กœ itemTags๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์คŒ
  • ๋ฌธ์ œ: ๊ตฌ๋งค๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋Š”๋ฐ ๋‹ค๋ฅธ ์Œ๋ฃŒ๊ฐ€ ๊ตฌ๋งค๋˜๋Š” ๋ฌธ์ œ;;
    • ์›์ธ: ๋””์ฝ”๋”ฉํ•˜๋ฉด์„œ shelf๊ฐ€ ๊ฐ€์ง„ itemTags๊ฐ€ viewController์— ์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€์•Š๊ณ  stock์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€œ. ์ฆ‰ shelf๊ฐ€ ์•„๋‹ˆ๋ผ stock์˜ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’ ์ˆœ์„œ๊ฐ€ ์ ์šฉ๋ผ์„œ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ˆœ์„œ์™€ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์Œ๋ฃŒ๊ฐ€ ๋ฆฌํ„ด๋œ ๊ฒƒ
    • ํ•ด๊ฒฐ : add๋‚˜ buy์ฒ˜๋Ÿผ ์žฌ๊ณ ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋™์ž‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์— self.inventory = self.inventory.update(other: newItemSet) ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด ๋งค๋ฒˆ stock์— ์žˆ๋Š” inventory์ˆœ์„œ๋Œ€๋กœ shelf ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ, ๋””์ฝ”๋”ฉํ• ๋•Œ ์ง€์ •ํ•ด์ค€ itemtags๊ฐ€ ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋œ ๋ฌธ์ œ๋กœ, ์ผ๋‹จ update๋ ๋•Œ๋งˆ๋‹ค shelf๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š๊ธฐ๋กœํ•จ
    • ๊ณ ๋ฏผํ•  ๋ฌธ์ œ:
      • ์ฝ˜์†”์—์„œ๋Š” stock์ด๋‚˜ shelf๋ฅผ ์ดˆ๊ธฐํ™”ํ• ๋•Œ ๋จผ์ € [Beverage]๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋ฉ”์„œ๋“œ์—์„œ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊พผํ›„ shelf๊นŒ์ง€ ์ดˆ๊ธฐํ™”ํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋ ๋•Œ๋‚˜ ํ•œ ์•„์ดํ…œ shelf๊ฐ€ ์•„์˜ˆ ๋น„์–ด๋ฒ„๋ ธ์„๋•Œ ์•„์ดํ…œ ์ง„์—ด ์ˆœ์„œ(key)๊ฐ€ ๋ฐ”๋€Œ์—ˆ์—ˆ๋Š”๋ฐ ์ง€๊ธˆ์€ viewController์—์„œ ์ง€์ •ํ•ด๋†“์€ ์ˆœ์„œ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ง€์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ๋งŒ ๋”•์…”๋„ˆ๋ฆฌ์™€ shelf๊ฐ€ ๊ตฌ์„ฑ๋˜๊ฒŒ ๋ฐ”๊ฟ”์•ผํ• ๋“ฏ
      • ์ด๋ ‡๊ฒŒ๋˜๋ฉด shelf๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™”ํ• ๋•Œ ํ•˜๋“œ์ฝ”๋”ฉ์„ ์•ˆํ•ด๋„๋ ๋“ฏ
      • ๋˜ํ•œ ์žฌ๊ณ ๊ฐ€ 0๊ฐœ์ธ ์•„์ดํ…œ key๋ฅผ ์ง€์šฐ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ key๋Š” ๋†”๋‘๊ณ  ์žฌ๊ณ ๊ฐ€ 0์ธ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ• ๋“ฏ
  • ์งˆ๋ฌธ๊ฑฐ๋ฆฌ