leegyoungmin / JuiceMaker

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

πŸ₯€ μ₯¬μŠ€ 메이컀 ν”„λ‘œμ νŠΈ

πŸ“‘ ν”„λ‘œμ νŠΈ μ†Œκ°œ

  • μ—¬λŸ¬κ°€μ§€μ˜ 과일 주슀λ₯Ό λ§Œλ“€λ•Œλ§ˆλ‹€ 과일 창고의 재고λ₯Ό κ΄€λ¦¬ν•˜κ³ , 이λ₯Ό UI둜 λ³΄μ—¬μ£ΌλŠ” μ•±μž…λ‹ˆλ‹€.

πŸ“ λͺ©μ°¨

πŸ§‘πŸ»β€πŸ’» 1. νŒ€μ›

애쉬 λ―Έλ‹ˆ
Ash
@ash-youu @leegyoungmin

πŸ”– 2. μˆœμ„œλ„

Component Diagram

FlowChart(Step1)

FlowChart(Step2)

FlowChart(Step3)

ClassDiagram

⏱ 3. νƒ€μž„λΌμΈ

  • 2022.08.29

    • κ³΅μ‹λ¬Έμ„œ ν•™μŠ΅
  • 2022.08.30

    • STEP1 κ΅¬ν˜„ CommitList
  • 2022.08.31

    • PR λ°œμ†‘ 및 κ³΅μ‹λ¬Έμ„œ ν•™μŠ΅
  • 2022.09.01

    • STEP1 README.md μž‘μ„± 및 κ³΅μ‹λ¬Έμ„œ ν•™μŠ΅
  • 2022.09.02

    • 좔가적인 리뷰에 λŒ€ν•œ μˆ˜μ • CommitList2
  • 2022.09.05

    • iOS UI μ•±κ°œλ°œ ν•™μŠ΅
  • 2022.09.06

    • STEP2 κ΅¬ν˜„ CommitList3
  • 2022.09.07

    • STEP2 README.md μž‘μ„± 및 PR λ°œμ†‘
  • 2022.09.08

    • STEP2 둜직 μˆ˜μ •
  • 2022.09.12

    • STEP3 UI μˆ˜μ •
    • 둜직 κ΅¬ν˜„
  • 2022.09.13

    • STEP3 둜직 μˆ˜μ •
    • STEP3 PR λ°œμ†‘

  • 2022.09.15

    • STEP3 리뷰에 λ”°λ₯Έ λ¦¬νŒ©ν† λ§ 진행

  • 2022.09.16

    • STEP3 README.md μž‘μ„±

πŸ’» 4. μ‹€ν–‰ ν™”λ©΄(κΈ°λŠ₯ μ„€λͺ…)

πŸ“Œ STEP 1

  • μ₯¬μŠ€λ©”μ΄μ»€λ‘œ makeJuice(juice:) ν•¨μˆ˜ μ‹€ν–‰

    class ViewController: UIViewController {
        private let maker = JuiceMaker()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            for _ in 1...20 {
                if let juice = Juice.allCases.randomElement() {
                    maker.makeJuice(juice: juice)
                }
            }
        }
    }
  • makeJuice(juice:) 및 haveStock(of:, over:),increaseStock(of:, by:) μ„€λͺ…

    func makeJuice(juice: Juice) {
        let juiceNeedFruits = juice.needFruits
        let juiceNeedStocks = juice.needStocks
        
        do {
        try fruitStore.haveStock(of: juiceNeedFruits, over: juiceNeedStocks)
        fruitStore.increaseStock(of: juiceNeedFruits, by: juiceNeedStocks)
        print("μ£Όλ¬Έν•˜μ‹  \(juice.description) λ‚˜μ™”μŠ΅λ‹ˆλ‹€.")
        } catch StoreError.outOfStock {
            print("μž¬κ³ κ°€ λΆ€μ‘±ν•©λ‹ˆλ‹€.")
        } catch {
            print("μ•Œ 수 μ—†λŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.")
        }
    }
    • 이 ν•¨μˆ˜λŠ” 주슀λ₯Ό λ§Œλ“œλŠ” λͺ…령을 λ‚΄λ¦¬λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
    • 이 ν•¨μˆ˜μ˜ κΈ°λŠ₯은 창고에 μž¬κ³ κ°€ μžˆλŠ”μ§€ 확인 ν›„ μžˆλ‹€κ³  νŒλ‹¨ν–ˆμ„ κ²½μš°μ—λ§Œ 창고의 재료λ₯Ό 가져와 음료λ₯Ό λ§Œλ“€ 도둝 μ„€κ³„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • λ§Œμ•½, μž¬κ³ κ°€ μ—†κ±°λ‚˜ λΆ€μ‘±ν•œ κ²½μš°μ—λŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    func haveStock(of fruits: [Fruit], over stocks: [Int]) throws {
        for (fruit, stock) in zip(fruits, stocks)  {
            guard let remainStock = inventory[fruit], remainStock >= -stock else {
                throw StoreError.outOfStock
            }
        }
    }
    • haveStock(of:, over:)은 주슀λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ μž¬κ³ κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
    • 이 ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬μ„œ μž¬κ³ κ°€ μ—†λŠ” κ²½μš°μ— μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λ„λ‘ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • λ§Œμ•½, μž¬κ³ κ°€ μžˆλ‹€λ©΄ ν•¨μˆ˜λŠ” μ’…λ£Œλ˜κ²Œ λ˜μ–΄, μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— makeJuice(juice:)ν•¨μˆ˜μ˜ λ‹€μŒ ꡬ문이 μ‹€ν–‰λ˜κ²Œ λ©λ‹ˆλ‹€.
    func increaseStock(of fruits: [Fruit], by amounts: [Int]) {
        for (fruit, stock) in zip(fruits, amounts) {
            if let remainStock = inventory[fruit] {
                inventory.updateValue(remainStock + stock, forKey: fruit)
            }
        }
    }
    • increaseStock(of:, by:)은 μž¬κ³ κ°€ μžˆλŠ” 주슀λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œ 재료λ₯Ό κΊΌλ‚΄μ˜€λŠ” 과정을 ν‘œν˜„ν•œ ν•¨μˆ˜μž…λ‹ˆλ‹€.
    • μ£ΌμŠ€μ— ν•„μš”ν•œ μž¬λ£Œλ“€κ³Ό 양을 ν†΅ν•΄μ„œ ν˜„μž¬ 창고의 재고λ₯Ό μ€„μ΄λŠ” 역할을 λ‹΄λ‹Ήν•˜κ²Œ λ©λ‹ˆλ‹€.
    • λ˜ν•œ, μ΄λŠ” μ–‘μˆ˜μ˜ 값이 λ“€μ–΄μ˜€κ²Œ 되면, 재고λ₯Ό μ¦κ°€μ‹œν‚€λŠ” ν•¨μˆ˜λ‘œλ„ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ STEP 2

FirstScreenGif

  • 음료 μ£Όλ¬Έ 및 이λ₯Ό ν†΅ν•΄μ„œ λ³€κ²½λœ μž¬κ³ μ— λŒ€ν•œ κ°’ 반영
  • 각 λ²„νŠΌμ€ 각각의 음료λ₯Ό μ£Όλ¬Έν•˜λŠ” λ²„νŠΌμ΄λ‹€.
  • 이 λ²„νŠΌμ„ λˆ„λ₯΄κ²Œ 되면, 주슀λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 재고λ₯Ό ν™•μΈν•œ ν›„ 주슀λ₯Ό λ§Œλ“€κ²Œ λœλ‹€.
  • μ΄λ•Œ, 주슀λ₯Ό λ§Œλ“€κ³  λ‚œ ν›„μ—λŠ” ν•„μš”ν•œ μž¬κ³ λ“€μ„ κ°μ†Œμ‹œν‚€κ²Œ λœλ‹€.
  • λ˜ν•œ, 화면에 λ³΄μ—¬μ§€λŠ” 데이터도 λ°”λ‘œ μ—…λ°μ΄νŠΈκ°€ λœλ‹€.

πŸ“Œ STEP 3

  • λ…ΈμΉ˜ν˜• κΈ°κΈ° μ‹€ν–‰ ν™”λ©΄
  • ν™ˆλ²„νŠΌ 보유 κΈ°κΈ° μ‹€ν–‰ μ˜ˆμ‹œ
  • 각 ν™”λ©΄μ—μ„œ 'μž¬κ³ μˆ˜μ •' ν˜Ήμ€ 'λ‹«κΈ°' λ²„νŠΌμ„ λˆ„λ₯΄λŠ” 경우, μ μ ˆν•œ ν™”λ©΄μœΌλ‘œ μ „ν™˜λœλ‹€.
  • 재고 μˆ˜μ • ν™”λ©΄μ—μ„œ Stepperλ₯Ό μ΄μš©ν•œ μˆ˜λŸ‰ λ³€κ²½ μ‹œ 메인 ν™”λ©΄μ—μ„œλ„ ν•΄λ‹Ή μˆ˜λŸ‰μœΌλ‘œ μ—…λ°μ΄νŠΈ λœλ‹€.
  • μ˜€ν† λ ˆμ΄μ•„μ›ƒμ„ 톡해 μƒμ΄ν•œ κΈ°μ’…μ˜ κΈ°κΈ°μ—μ„œλ„ ν†΅μΌλœ 화면이 λ³΄μ—¬μ§€κ²Œ λœλ‹€.

πŸš€ 5. νŠΈλŸ¬λΈ” μŠˆνŒ…

πŸ“Œ STEP 1

  • makeJuice() μ—μ„œ juice별 ν•¨μˆ˜ ν˜ΈμΆœμ— λŒ€ν•œ 문제
    • κ°€λ³€ λ§€κ°œλ³€μˆ˜λ₯Ό ν™œμš©ν•˜λŠ” 방법과 리슀트λ₯Ό λ°˜ν™˜ν•˜λŠ” 방법

      // Before
      func makeJuice(juice: Juice) {
           switch juice {
              ...
           case .strawberrybananaJuice:
               if fruitStore.checkStock(fruit: .strawberry, stock: -10) &&
                   fruitStore.checkStock(fruit: .banana, stock: -1) {
                   fruitStore.changeStock(fruits: .strawberry, .banana, stocks: -10, -1)
               }
           case .mangokiwiJuice:
               if fruitStore.checkStock(fruit: .mango, stock: -2) &&
                   fruitStore.checkStock(fruit: .kiwi, stock: -1) {
                   fruitStore.changeStock(fruits: .mango, .kiwi, stocks: -2, -1)
               }
           }
       }
      
      // After
      func makeJuice(juice: Juice) {
          let juiceNeedFruits = juice.needFruits
          let juiceNeedStocks = juice.needStocks
      
          do {
          try fruitStore.haveStock(of: juiceNeedFruits, over: juiceNeedStocks)
          fruitStore.increaseStock(of: juiceNeedFruits, by: juiceNeedStocks)
          } catch StoreError.outOfStock {
              print("μž¬κ³ κ°€ λΆ€μ‘±ν•©λ‹ˆλ‹€.")
          } catch {
              print("μ•Œ 수 μ—†λŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.")
          }
      }
    • Beforeκ³Ό 같이 호좜 μ‹œ juice의 μΌ€μ΄μŠ€ λ³„λ‘œ haveStock()κ³Ό increaseStock()을 각각 ν˜ΈμΆœν•΄μ€˜μ•Ό ν•˜μ—¬ μ½”λ“œμ˜ 쀑볡도가 λ†’μ•„μ§€λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

    • Juice νƒ€μž…μ—μ„œ 주슀 λ³„λ‘œ ν•„μš”ν•œ 과일(needFruits)κ³Ό μˆ˜λŸ‰(needStocks)을 μ„ μ–Έν•˜μ—¬ needFruitAndStock: [Fruit: Int]의 Dictionary νƒ€μž…μ„ haveStock()κ³Ό increaseStock() λ‚΄λΆ€μ—μ„œ ν™œμš©ν•˜λŠ” λ°©ν–₯으둜 μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ“Œ STEP 2

  • 객체의 싱글톀화에 λŒ€ν•œ κ³ λ―Ό

    • μ‹±κΈ€ν†€μ˜ μž₯μ μ—λŠ” ν•œ 번의 Instance만 μƒμ„±ν•˜μ—¬μ„œ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ‹€λ₯Έ μžμ›λ“€κ³Ό κ³΅μœ κ°€ μ‰½λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.
    • 싱글톀 μ‚¬μš©μ΄ μ ˆλŒ€μ μœΌλ‘œ μž₯점만 μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄μ„œ λ©”μ„œλ“œμ˜ 변경이 이루어 μ§ˆλ•Œ λ§ˆλ‹€ μˆ˜μ •μ„ ν•΄μ•Ό ν•˜λŠ” 뢀뢄이 많이 μƒκΈ΄λ‹€λ˜μ§€, λ§Žμ€ 데이터λ₯Ό κ³΅μœ ν•  경우 λ‹€λ₯Έ 클래슀의 Instanceλ“€ κ°„ 결합도가 λ†’μ•„μ§€κ²Œ λ©λ‹ˆλ‹€.
    • λ‹€μ–‘ν•œ 쑰건과 ν”„λ‘œμ νŠΈμ˜ λ°©ν–₯성에 λŒ€ν•œ λ…Όμ˜λ₯Ό ν•˜μ—¬μ„œ ν™•μž₯성을 μƒκ°ν•˜μ˜€μ„ λ•Œ, 좔가적인 μ°½κ³  Instanceκ°€ μƒμ„±λ˜κ³ , 1호점, 2호점 λ“±κ³Ό 같은 ν™•μž₯μ—μ„œ 결합도가 λ†’μ•„μ§ˆ 것이라고 νŒλ‹¨ν•˜μ—¬μ„œ 싱글톀을 μ‚¬μš©ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” JuiceMaker νƒ€μž…μ΄ FruitStore νƒ€μž…μ„ μ†Œμœ ν•˜κ³  μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • NotificationCenter ν™œμš© μ‹œ ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’ 섀정이 λΆˆκ°€ν•œ 문제

    class FruitStore {
        private var inventory: [Fruit: Int] = Fruit.beginningStock {
            didSet {
                NotificationCenter.default.post(
                            name: Notification.Name.stockChanged,
                            object: nil,
                            userInfo: inventory
                        )
            }
          }
    }
    • FruitStore의 inventory κ°’ λ³€ν™”λ₯Ό ν”„λ‘œνΌν‹° κ°μ‹œμž(didSet) 내에 NotificationCenterλ₯Ό μ‚¬μš©ν•΄ JuiceMakerViewController에 μ „λ‹¬ν•˜λŠ” 방식을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
    • 이와 같이 진행 μ‹œ inventory 값이 λ³€ν•  λ•Œμ—λ§Œ NotificationCenter에 postν•˜κ²Œ λ˜μ–΄ λ§›μžˆλŠ” μ₯¬μŠ€λ₯Ό λ§Œλ“€μ–΄ λ“œλ €μš”! Viewμ—μ„œ μ΄ˆκΈ°κ°’μ˜ 반영이 μ–΄λ €μš΄ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    • 앱이 μƒˆλ‘œ 켜질 λ•Œλ§ˆλ‹€ 과일의 μˆ˜λŸ‰μ€ λͺ¨λ‘ 10으둜 μ΄ˆκΈ°ν™”λ˜κΈ° λ•Œλ¬Έμ— View λ‚΄μ—μ„œ 과일별 StockLabel을 10으둜 μ„€μ •ν•˜κ³ , 이후 inventory의 값이 변경될 λ•Œλ§ˆλ‹€ didSet을 톡해 StockLabel.textκ°€ μˆ˜μ •λ  수 μžˆλ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ STEP 3

  • λ„ˆλ¬΄ λ§Žμ€ @IBOutlet λ³€μˆ˜ μ„ μ–Έ

    • κΈ°μ‘΄μ—λŠ” 과일별 재고 λ ˆμ΄λΈ”μ„ κ°œλ³„ @IBOultet λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • 이와 같이 μž‘μ„±ν•˜κ²Œ λ˜λŠ” 경우, JuiceMakerViewController와 ModifyViewController ν΄λž˜μŠ€μ—μ„œ λͺ¨λ“  λ ˆμ΄λΈ”μ— λŒ€ν•œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ²Œ λ˜μ–΄ λ„ˆλ¬΄ λ§Žμ€ @IBOutlet λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ²Œ λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ, forEach문을 톡해 λ ˆμ΄λΈ”μ˜ text값을 μ—…λ°μ΄νŠΈν•  λ•Œμ—λ„ λͺ¨λ“  κ°œλ³„ λ ˆμ΄λΈ”μ„ μ·¨ν•©ν•΄ λ°°μ—΄λ‘œ μž¬μ •μ˜ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    • @IBOutlet을 톡해 λ ˆμ΄λΈ”μ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ, [UILabel] νƒ€μž…μ˜ fruitLabels둜 선언될 수 있게 ν•˜μ˜€κ³ , forEach문을 톡해 값을 μ—…λ°μ΄νŠΈν•  λ•Œμ—λ„ ν•΄λ‹Ή 배열을 ν™œμš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
        // Before 
        @IBOutlet weak var strawberryStockLabel: UILabel!
        @IBOutlet weak var bananaStockLabel: UILabel!
        @IBOutlet weak var pineAppleStockLabel: UILabel!
        @IBOutlet weak var kiwiStockLabel: UILabel!
        @IBOutlet weak var mangoStockLabel: UILabel!
      
        // After
        @IBOutlet var fruitLabels: [UILabel]!
  • NotificationCenterλ₯Ό ν†΅ν•œ μ˜΅μ €λΉ™ νŒ¨ν„΄κ³Ό μ˜μ‘΄μ„± μ£Όμž…

    • STEP 2 μ—μ„œ λ°œμƒν•˜μ˜€λ˜ μ΄ˆκΈ°ν™” λ‹¨κ³„μ—μ„œ ν™œμš©ν•  수 μ—†μ—ˆλ˜ λ¬Έμ œμ™€ λ‘λ²ˆμ§Έ ν™”λ©΄μ—μ„œ 데이터λ₯Ό μ „λ‹¬ν•˜κ³  λ‘κ°œμ˜ λ·° μ»¨νŠΈλ‘€λŸ¬κ°€ 같은 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” 데에 λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ 지연 생성 ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•΄μ„œ JuiceMaker에 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜μ—¬μ„œ FruitStore둜 μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό JuiceMakerViewControllerκ°€ 가지고 μžˆλ„λ‘ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ, 이λ₯Ό ν†΅ν•΄μ„œ ModifyViewController에 데이터λ₯Ό Delegate Pattern으둜 λ”μš± μ‰½κ²Œ 데이터λ₯Ό 전달할 수 μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • μΆ”κ°€μ μœΌλ‘œ Delegateμ—μ„œ μ •μ˜ν•œ ν”„λ‘œνΌν‹°λ₯Ό 읽기 μ „μš© ν”„λ‘œνΌν‹°λ‘œ μ μš©ν•˜μ—¬μ„œ ModifyViewControllerμ—μ„œ μ§μ ‘μ μœΌλ‘œ μˆ˜μ •ν•˜λŠ” 것을 λ°©μ§€ν•˜κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • μœ„μ™€ 같은 μƒν™©μ—μ„œ NotificationCenterλ₯Ό ν™œμš©ν•˜μ—¬μ„œ FruitStore에 μžˆλŠ” 데이터 변경을 κ΄€μ°°ν•˜λŠ” 것은 데이터 변경에 λ”°λ₯Έ 뷰의 κ°±μ‹ λ§Œ ν•  수 있게 λ˜λŠ” 것이 μž₯점이라고 μƒκ°ν•˜μ˜€κ³ , μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜μ˜€μ„ λ•Œμ—λŠ” λ°μ΄ν„°μ˜ 변경을 κ΄€μ°°ν•˜μ§€ μ•Šμ•„μ„œ 데이터 뷰의 갱신을 μ§μ ‘μ μœΌλ‘œ ν•΄μ€˜μ•Ό ν•˜μ§€λ§Œ, λ‘λ²ˆμ§Έ ν™”λ©΄κ³Όμ˜ 데이터λ₯Ό κ³΅μœ ν•  수 μžˆλŠ” 것이 μž₯점이라고 μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • μ €ν¬λŠ” 이와 같은 μƒν™©μ—μ„œ μ–΄λ–€ 방법이 더 μ μ ˆν•œ 방법인지에 λŒ€ν•΄μ„œ κ³ λ―Όν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
      private let store = FruitStore()
      lazy var maker = JuiceMaker(store: store)
  • Delegate νŒ¨ν„΄μ˜ 읽기 μ „μš© ν”„λ‘œνΌν‹°

    • segueλ₯Ό ν†΅ν•΄μ„œ 데이터λ₯Ό 전달할 λ•Œ,λ‘λ²ˆμ§Έ 뷰컨트둀러의 μΈμŠ€ν„΄μŠ€μ™€ 첫번째 λ·° 컨트둀러의 store의 μž¬κ³ λŠ” λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— 화면이 Dismiss 되기 전에 데이터λ₯Ό λ‹€μ‹œ λ„˜κ²¨μ„œ λ³€κ²½ν•΄μ€˜μ•Ό ν•˜λŠ” 단점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    • μ €ν¬λŠ” 화면이 μ „ν™˜λ  λ•Œ 데이터λ₯Ό λ°˜μ˜ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ‚¬μš©μžμ˜ μ΄λ²€νŠΈμ— λ”°λΌμ„œ μ§μ ‘μ μœΌλ‘œ λ³€ν™”λ₯Ό μ£Όκ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ Delegate Pattern을 ν™œμš©ν•˜μ—¬μ„œ λ°μ΄ν„°μ˜ λ³€ν™”λ₯Ό λ°˜μ˜ν•˜κ³ , λ‘λ²ˆμ§Έ ν™”λ©΄μ˜ μ΄ˆκΈ°κ°’μ„ λ°˜μ˜ν•  수 μžˆλ„λ‘ μ½κΈ°μ „μš© ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • 처음 μ μš©ν•  λ•Œμ—λŠ” λ‹¨μˆœνžˆ get을 적어 λ‘μ—ˆμœΌλ‹ˆκΉŒ μ½κΈ°μ „μš©μœΌλ‘œ κ΅¬ν˜„μ„ ν•œκ²ƒμ΄λΌκ³  μƒκ°ν•˜μ—¬μ„œ μ΄μŠˆκ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • ν•˜μ§€λ§Œ, λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” κ²ƒκ³ΌλŠ” 달리, ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ½κΈ°μ „μš© ν”„λ‘œνΌν‹°μ—λŠ” μ–΄λ–€ 것듀이 있고, 읽기와 μ“°κΈ°κ°€ λͺ¨λ‘ κ°€λŠ₯ν•œ ν”„λ‘œνΌν‹°λŠ” μ–΄λ–€ 것듀이 μžˆλŠ”μ§€ μ•Œμ•„μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.
    • 이에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•œ κ²°κ³Ό, ν”„λ‘œν† μ½œμ—μ„œμ˜ get, set ν‚€μ›Œλ“œλŠ” 읽기 μ „μš©κ³Ό μ“°κΈ°κ°€λŠ₯에 λŒ€ν•œ 것을 μ •μ˜λ§Œ ν•œλ‹€λŠ” 것을 μ•Œμ•˜κ³ , μ €μž₯ ν”„λ‘œνΌν‹°μ™€ μ—°μ‚° ν”„λ‘œνΌν‹°μ—μ„œ 읽기 μ „μš© ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λŠ” 방법과 μ“°κΈ° κ°€λŠ₯ ν”„λ‘œνΌν‹°λ₯Ό μ •μ˜ν•˜λŠ” 방법이 μžˆλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό λ°”νƒ•μœΌλ‘œ μ—°μ‚° ν”„λ‘œνΌν‹°μ—μ„œμ˜ μ½κΈ°μ „μš© ν”„λ‘œνΌν‹°λ₯Ό μ μš©ν•˜μ—¬μ„œ λ‘λ²ˆμ§Έ λ·° μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ½λŠ” κ²ƒλ§Œ κ°€λŠ₯ν•œ 데이터λ₯Ό 전달할 수 μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
      extension JuiceMakerViewController: ModifyStockDelegate {
          var inventory: [Fruit: Int] {
              get {
                  return store.inventory
              }
          }
      
          func updateStock(by fruit: Fruit, to stock: Int) {
              store.inventory[fruit] = stock
              updateStockLabels()
          }
      }

πŸ“Ž 6. μ°Έκ³  링크

About


Languages

Language:Swift 100.0%