GithubHelp home page GithubHelp logo

juicemakerapp's Introduction

๐Ÿงƒ ์ฅฌ์Šค ๋ฉ”์ด์ปค

0. ๋ชฉ์ฐจ

  1. ์†Œ๊ฐœ
  2. ํŒ€์›
  3. ํƒ€์ž„๋ผ์ธ
  4. ์‹œ๊ฐํ™”๋œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
  5. ์‹คํ–‰ ํ™”๋ฉด
  6. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
  7. ํ•ต์‹ฌ ๊ฒฝํ—˜
  8. ์ฐธ๊ณ  ๋งํฌ

1. ์†Œ๊ฐœ

์‚ฌ์šฉ์ž์˜ ์ฃผ๋ฌธ์— ๋”ฐ๋ฅธ ๐Ÿงƒ๊ณผ์ผ์ฅฌ์Šค ๋งŒ๋“ค๊ธฐ ์•ฑ์ž…๋‹ˆ๋‹ค! ์‹ค์‹œ๊ฐ„ ๊ณผ์ผ ์žฌ๊ณ ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณผ์ผ์˜ ์žฌ๊ณ  ์ˆ˜์ •๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!


![image]()

2. ํŒ€์›

์• ์ข… zhilly bella
@jonghancha @zhilly11 @hyhy0429

3. ํƒ€์ž„๋ผ์ธ

[STEP-1]

  • 220829: Ground Rule ์ž‘์„ฑ, STEP-1 Flow Chart ์ž‘์„ฑ
  • 220830: FruitStore, JuiceMaker ๋ชจ๋ธํŒŒ์ผ ์ž‘์„ฑ
    • FruitStore: ์žฌ๊ณ  ๋ณ€์ˆ˜, ์žฌ๊ณ ์— ์ ‘๊ทผ, ์žฌ๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ž‘์„ฑ
    • JuiceMaker: Juice Recipe๋ฅผ NestedType์„ ํ†ตํ•ด ๊ตฌํ˜„, ์žฌ๊ณ  ์ˆ˜์ • ๊ธฐ๋Šฅ, ์ œ์•ฝ์‚ฌํ•ญ์— ๋”ฐ๋ฅธ ์—๋Ÿฌ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  • 220831: ์ ‘๊ทผ์ˆ˜์ค€ ์ง€์ •์„ ์œ„ํ•œ Protocol ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์บก์Šํ™”& ์€๋‹‰ํ™” ๊ตฌํ˜„
    • ์ฐธ์กฐ๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค ๋”ฐ๋กœ extension ClassName: ProtocolName {} ๋กœ ์ด๋™

[STEP-2]

  • 220906: NotificationCenter ์ด์šฉ
    • ์•Œ๋ฆผ ์ „์†ก ์‹œ, ์ฅฌ์Šค์˜ ์ด๋ฆ„๊ณผ ์ฅฌ์Šค์™„์„ฑ์—ฌ๋ถ€๋ฅผ userInfo์— ๋‹ด์•„ postํ•˜๋„๋ก ๊ตฌํ˜„
  • 220908: juiceMaker ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์œ„์น˜
    • FruitJuiceStoreViewController ๋‚ด๋ถ€์—์„œ ViewDidLoad ๊ธฐ์ค€ ๋‚ด๋ถ€์™€ ์™ธ๋ถ€ ์ค‘ juiceMaker ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์œ„์น˜์— ๋Œ€ํ•ด ํ† ์˜
  • 220913: Modelํด๋” ๋‚ด๋ถ€์˜ JuiceMaker.takeOrder๋ฉ”์„œ๋“œ ViewController.takeOrder๋กœ ์œ„์น˜ ๋ณ€๊ฒฝ
    • Controller ๋‹จ์œ„์—์„œ ์—๋Ÿฌ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง์— ๋”ฐ๋ผ NotificationCenter๊ธฐ๋Šฅ ์‚ญ์ œ

[STEP-3]

  • 220916: ํ™”๋ฉด ์ „ํ™˜ ์‹œ, ์ „๋‹ฌ๊ฐ’ ๋ฐฉ๋ฒ• ๊ฒฐ์ •
    • ์žฌ๊ณ  ์ถ”๊ฐ€ ํ™”๋ฉด ์ „ํ™˜ ์‹œ, ์žฌ๊ณ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด class FruitStore() vs fruitStock: [Fruit: Int] ๋‘˜ ์ค‘ ์–ด๋–ค ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๊ณต์œ ํ•  ์ง€์— ๋Œ€ํ•ด ํ† ์˜
  • 220916: ์žฌ๊ณ  ์ถ”๊ฐ€ ํ™”๋ฉด์œผ๋กœ์˜ ํ™”๋ฉด์ „ํ™˜๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ† ์˜. segue ์—ฐ๊ฒฐ vs present()
    • storyboard ์ƒ์˜ segue๋ฅผ ์—ฐ๊ฒฐํ•ด ํ™”๋ฉด ์ „ํ™˜
    • ํ™”๋ฉด์ „ํ™˜ ์‹œ prepare ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด fruitStock๊ฐ’ ๊ณต์œ 

4. ์‹œ๊ฐํ™”๋œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

File Tree

.
โ”œโ”€โ”€ Controller
โ”‚ย ย  โ”œโ”€โ”€ AppDelegate.swift
โ”‚ย ย  โ”œโ”€โ”€ FruitJuiceStoreViewController.swift
โ”‚ย ย  โ”œโ”€โ”€ FruitStockEditorViewController.swift
โ”‚ย ย  โ”œโ”€โ”€ JuiceMaker.swift
โ”‚ย ย  โ””โ”€โ”€ SceneDelegate.swift
โ”œโ”€โ”€ Model
โ”‚ย ย  โ”œโ”€โ”€ Enum
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Variation.swift
โ”‚ย ย  โ”œโ”€โ”€ Fruit
โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Fruit.swift
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ FruitStore.swift
โ”‚ย ย  โ””โ”€โ”€ Juice
โ”‚ย ย      โ”œโ”€โ”€ Juice.swift
โ”‚ย ย      โ”œโ”€โ”€ JuiceMaker.swift
โ”‚ย ย      โ””โ”€โ”€ JuiceMakerError.swift
โ”œโ”€โ”€ Protocol
โ”‚ย ย  โ”œโ”€โ”€ FruitStockDelegate.swift
โ”‚ย ย  โ”œโ”€โ”€ FruitStoreProtocol.swift
โ”‚ย ย  โ””โ”€โ”€ JuiceMakerProtocol.swift
โ””โ”€โ”€ View
    โ””โ”€โ”€ Base.lproj
        โ”œโ”€โ”€ LaunchScreen.storyboard
        โ””โ”€โ”€ Main.storyboard

Flow Chart

STEP-1

STEP-2

Class Diagram


5. ์‹คํ–‰ ํ™”๋ฉด(๊ธฐ๋Šฅ ์„ค๋ช…)

์ฃผ์Šค ์ฃผ๋ฌธ ์„ฑ๊ณต ์ฃผ์Šค ์ฃผ๋ฌธ ์‹คํŒจ
Simulator Screen Recording - iPhone 14 Pro - 2022-09-16 at 14 09 53 Simulator Screen Recording - iPhone 14 Pro - 2022-09-16 at 14 08 45 แ„‡แ…ฉแ†จแ„‰แ…กแ„‡แ…ฉแ†ซ

6. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

fruitStock ํƒ€์ž… ๊ฒฐ์ •

  • ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์žฌ๊ณ ๋ฅผ ์˜๋ฏธํ•˜๋Š” fruitStore์˜ ํƒ€์ž…์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์ผ์˜ ์ด๋ฆ„๊ณผ ํ•ด๋‹น๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ๋™์‹œ์— ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ๊ณ  ํ™•์ธ์„ ์œ„ํ•ด Value์— ์ ‘๊ทผํ•  ๋•Œ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํŠน์ง•์ƒ ์˜ต์…”๋„์„ ์ฒดํฌํ•ด์ค˜์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์„ ๊ฒƒ ๊ฐ™์•„ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

Juice ์ถ”์ƒํ™”

  • Juice ํŒŒ์ผ๋‚ด์— Recipe ํƒ€์ž…์„ ์ƒ์„ฑ ํ•  ๋•Œ์—, Netsted Types์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. User๊ฐ€ ์„ ํƒํ•œ Juice ์ค‘์—์„œ ํ•œ์ข…๋ฅ˜์˜ ๊ณผ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋‘ ์ข…๋ฅ˜์˜ ๊ณผ์ผ์„ ์ด์šฉํ•˜์—ฌ ์ œ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ, ์ฒ˜์Œ์—๋Š” ๋‘๋ฒˆ์งธ ์ข…๋ฅ˜์˜ ๊ณผ์ผ๊ณผ ์ˆ˜๋Ÿ‰์„ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์˜ต์…”๋„๋กœ ์„ ์–ธ์„ ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€์œผ๋‚˜, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ณต์žกํ•œ ํ›„ํ–‰ ์ฒ˜๋ฆฌ : ๋‘ ๋ฒˆ์งธ ์ข…๋ฅ˜์˜ ๊ณผ์ผ๊ฐ’์ด ์˜ต์…”๋„๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋‘ ๋ฒˆ ์ข…๋ฅ˜์˜ ๊ณผ์ผ ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์˜ต์…”๋„๋ฐ”์ธ๋”ฉ์„ ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊น๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ์— ์„ธ ๋ฒˆ์งธ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฅฌ์Šค๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด? : ์„ธ ๋ฒˆ์งธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ณ , ์ด๋Š” ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž, ๊ธฐ์กด์˜ ๊ตฌํ˜„ํ–ˆ๋˜ ๋‘๋ฒˆ์งธ ๊ณผ์ผ ์ข…๋ฅ˜๋ฅผ ์˜ต์…”๋„๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ณผ์ผ์ข…๋ฅ˜์™€ ํ•„์š”์ˆ˜๋Ÿ‰์„ ๋ฐฐ์—ด์— ๋‹ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.
// ๊ธฐ์กด Recipe ๊ตฌ์กฐ์ฒด
struct Recipe {
        let first: (Fruit, Int)
        let second: (Fruit, Int)?
    }

// Recipe ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ ๋ณ€๊ฒฝ
struct Recipe {
        let name: Fruit
        let amount: Int
    }

// 1๋ฒˆ ๋ฐฉ๋ฒ•: ๊ธฐ์กด์˜ ์˜ต์…”๋„์„ ํ™œ์šฉํ•˜์—ฌ ๋ ˆ์‹œํ”ผ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
var recipe: Recipe {
    switch self {
    case .strawberryJuice:
        return Recipe(first: (.strawberry, 16), second: nil)
    case .strawberryBananaJuice:
    return Recipe(first: (.strawberry, 10), second: (.banana, 1))
}

// 2๋ฒˆ ๋ฐฉ๋ฒ•: ๊ณ ๋ฏผ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ ˆ์‹œํ”ผ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
var recipe: [Recipe] {
    switch self {
    case .strawberryJuice:
        return [Recipe(name: .strawberry, amount: 16)]
    case .strawberryBananaJuice:
        return [Recipe(name: .strawberry, amount: 10), Recipe(name: .banana, amount: 1)]
}
  • ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์“ฐ๊ฒŒ ๋˜๋ฉด, ์ถ”ํ›„ ์–ผ์Œ ๋˜๋Š” ์„คํƒ•๊ณผ ๊ฐ™์€ ์žฌ๋ฃŒ์˜ ์ถ”๊ฐ€์˜ ๊ฒฝ์šฐ์—๋„ ์†์‰ฝ๊ฒŒ Recipe ๊ตฌ์กฐ์ฒด๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Error Handling

  • [STEP-1] ์†Œ์Šค์—์„œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ isEnoughStock() ๋ฉ”์„œ๋“œ๋งŒ์„ ์ด์šฉํ•ด ๋‹จ์ˆœํ•˜๊ฒŒ ์žฌ๊ณ ๊ฐ€ ์ˆ˜์ •ํ•ด์•ผํ•  ์–‘๋ณด๋‹ค ์ ์„ ๊ฒฝ์šฐ, ์˜ค๋ฅ˜ ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์ •๋„๋กœ error๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ถ”ํ›„ ViewController ๋‹จ์œ„๋กœ ์ž‘์—…์„ ๋„“ํ˜€๊ฐ„๋‹ค๋ฉด do-try-catch ๋˜๋Š” result ์ค‘์— ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์–ด๋Š ๋‹จ์œ„์—์„œ ๊ตฌํ˜„ํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • [STEP-2] ๊ธฐ์กด์˜ ์žฌ๊ณ ๊ฐ€ ์ถฉ๋ถ„ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ isEnoughStock()๋ฅผ ํ™œ์šฉ ๋ฐ ์ˆ˜์ •ํ•ด checkEnoughStock(juiceRecipe: [Juice.Recipe]) throws๋กœ ๋ณ€๊ฒฝํ•ด ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฅฌ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋กœ์ง์„ ViewController๋‹จ์œ„๋กœ ์˜ฎ๊น€์— ๋”ฐ๋ผ JuiceMaker์—์„œ ์—๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ๋‹ค์‹œ return ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋‹ˆ์ง€์Šค๋กœ์ง์— ๋Œ€ํ•œ ์ดํ•ด์— ๋”ฐ๋ฅธ NotificationCenter ์‚ฌ์šฉ ์ทจ์†Œ

  • ๊ธฐ์กด์—๋Š” JuiceMaker์— ์ฃผ์Šค๋ฅผ ์ฃผ๋ฌธ๋ฐ›๋Š” takeOrder๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—๋Š” NotificationCenter๊ฐ€ postํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ผ, ์ฅฌ์Šค ์ฃผ๋ฌธ ์‹œ์— ํ•„์š”ํ•œ ํ•ด๋‹น ๋ ˆ์‹œํ”ผ์— ๋”ฐ๋ฅธ ๊ณผ์ผ์–‘์„ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ณผ์ผ์žฌ๊ณ  ์œ ๋ฌด์— ๋”ฐ๋ฅธ ์„ฑ๊ณต/์‹คํŒจ ์–ผ๋Ÿฟ์„ ๋„์›Œ์ฃผ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋น„๋‹ˆ์ง€์Šค๋กœ์ง์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ณ  takeOrder ๋ฉ”์„œ๋“œ์˜ ์œ„์น˜์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜๋ฉด์„œ takeOrder ๋ฉ”์„œ๋“œ์˜ ์œ„์น˜๋ฅผ FruitJuiceStoreViewController๋กœ ์˜ฎ๊ธฐ๊ฒŒ ๋˜๋ฉด์„œ NotificationCenter์˜ ์•Œ๋ฆผ์„ ์ „์†ก๋ฐ›๊ฒŒ ๋  ์ด์œ ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด ์‚ฌ์ด ๋ฐ์ดํ„ฐ๊ณต์œ  ์‹œ ๊ณต์œ ํ•  ๋ฐ์ดํ„ฐํƒ€์ž…์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

  • ์ฅฌ์Šค๋ฉ”์ด์ปค ํ™”๋ฉด์—์„œ ์žฌ๊ณ  ์ถ”๊ฐ€ ํ™”๋ฉด์œผ๋กœ ํ™”๋ฉด์ „ํ™˜์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ FruitStore()ํด๋ž˜์Šค๋ฅผ ๊ณต์œ ํ• ์ง€, fruitStock: [Fruit: Int]๊ฐ’์„ ๊ณต์œ ํ• ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒ€์›๋“ค๊ณผ ํ† ์˜ํ•œ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ fruitStock๊ฐ’์„ ๊ณต์œ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ฒซ๋ฒˆ์งธ ์ด์œ : FruitStore()์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. fruitStockํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์™ธํ•œ FruitStore() ๋‚ด๋ถ€์š”์†Œ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ๊ณต์œ ํ•˜๊ธฐ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋‘๋ฒˆ์งธ ์ด์œ : ์ฐธ์กฐ ํƒ€์ž…์ธ์ง€ ๊ฐ’ ํƒ€์ž…์ธ์ง€ ๋ถˆ๋ถ„๋ช…ํ•œ ํƒ€์ž…์„ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์˜ค๋ฅ˜๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— fruitStock๊ฐ’์„ ๊ณต์œ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์žฌ๊ณ ์ถ”๊ฐ€ ํ™”๋ฉด์œผ๋กœ์˜ ํ™”๋ฉด์ „ํ™˜๋ฐฉ๋ฒ• ์„ ํƒ

// 1๋ฒˆ ๋ฐฉ๋ฒ•: Segueway๋ฅผ ํ†ตํ•œ ์ „ํ™˜
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let fruitStockEditorViewController = segue.destination as?  FruitStockEditorViewController else { return }

        fruitStockEditorViewController.delegate = self
        fruitStockEditorViewController.editingFruitStock = receiveFruitStock()
}


// 2๋ฒˆ ๋ฐฉ๋ฒ•: present๋ฅผ ์ด์šฉํ•œ ์ „ํ™˜ 
@IBAction func touchUpEditButton(_ sender: Any) {
        guard let fruitStockEditorViewController = self.storyboard?.instantiateViewController(identifier: "FruitStockEditorViewController") as? FruitStockEditorViewController else { return }

        fruitStockEditorViewController.delegate = self
        fruitStockEditorViewController.editingFruitStock = receiveFruitStock()
        present(fruitStockEditorViewController, animated: true, completion: nil)
}
  • ์œ„ ์ฝ”๋“œ์— ๊ธฐ์žฌ๋œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘, Segueway ๋ฅผ ํ†ตํ•œ ์ „ํ™˜๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ฒซ๋ฒˆ์งธ ์ด์œ : ํ˜„์žฌ๋Š” ๊ฐ™์€ Storyboard์—์„œ ์กด์žฌํ•˜๋Š” ๋‘๊ฐœ์˜ ViewController๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ •๋„์˜ ํ”„๋กœ์ ํŠธ ์ด๊ธฐ์— ์ด์™€๊ฐ™์€ ๋ฐฉ๋ฒ•๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋‘๋ฒˆ์งธ ์ด์œ : FruitStockEditorViewController๋กœ ์ด๋™๋˜๋Š” ๋กœ์ง์ด ๋‘ ๊ฐ€์ง€๋ผ์„œ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑํ•ด๋„ ๋˜๋Š” segueway ๋ฐฉ์‹์„ ์„ ํƒํ•ด prepare๋ฅผ overrideํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

7. ํ”„๋กœ์ ํŠธ ์ˆ˜ํ–‰ ์ค‘ ํ•ต์‹ฌ ๊ฒฝํ—˜

  • ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋Šฅ๋‹จ์œ„ ๋ถ„๋ฆฌ
  • ๊ฐ ํƒ€์ž… ๋‚ด ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ๊ณ ๋ฏผ
  • Nested Types ์‚ฌ์šฉ
  • Initalization์— ๋Œ€ํ•œ ๊ณ ๋ฏผ
  • Class์™€ Struct ํƒ€์ž… ์ฐจ์ด์— ๋”ฐ๋ฅธ ์ด์šฉ
  • ์ ‘๊ทผ์ œ์–ด ๋‹จ๊ณ„์— ๋”ฐ๋ฅธ ์€๋‹‰ํ™”
  • UIkit ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ดํ•ด์™€ ํ™œ์šฉ
    • ํ™”๋ฉด ์ „ํ™˜๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด
    • IBOulet๊ณผ IBAction์— ๋Œ€ํ•œ ์ดํ•ด
    • Alret๊ณผ Stepper์˜ ํ™œ์šฉ
    • ํ™”๋ฉด ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ 

8. ์ฐธ๊ณ  ๋งํฌ


๐Ÿ” ๋งจ ์œ„๋กœ ์ด๋™ํ•˜๊ธฐ

juicemakerapp's People

Contributors

jonghancha avatar zhilly11 avatar yagom avatar hyhy0429 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.