# ๐Ÿงƒios-juice-maker **[Step 1]** ์ฅฌ์Šค ๋ฉ”์ด์ปค ํƒ€์ž… ์ •์˜<br> **[Step 2]** ์ดˆ๊ธฐํ™”๋ฉด ๊ธฐ๋Šฅ ๊ตฌํ˜„<br> **[Step 3]** ์žฌ๊ณ ์ˆ˜์ •, ์•Œ๋ฆผ์ฐฝ ๊ธฐ๋Šฅ ๋ฐ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ตฌํ˜„<br> <br> ## ๐Ÿ“ฒ ์‹คํ–‰ ํ™”๋ฉด ![iPhone14 ์‹คํ–‰ ํ™”๋ฉด](https://user-images.githubusercontent.com/71758542/212254842-103d29d2-aee5-4df5-9095-7ef586578b8b.gif) <br> ## ๐Ÿ“‚ ํด๋” ๊ตฌ์กฐ ![](https://i.imgur.com/EBqz4IP.png) <br> ## โ—๏ธ ํƒ€์ž…๋ณ„ ์—ญํ•  ๋ถ„๋ฐฐ | struct | ์—ญํ•  | | --- | --- | | `Fruit` | - ๊ณผ์ผ๋“ค์˜ ์ด๋ฆ„๊ณผ ์žฌ๊ณ ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ฒด | | `OrderMessage` | - ์ฃผ๋ฌธ๋œ ๊ณผ์ผ ์ด๋ฆ„๊ณผ ํ•„์š”ํ•œ ์–‘์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ฒด | | `JuiceMaker` | - ์ฃผ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ฒด| | class | ์—ญํ•  | | --- | --- | | `FruitStore` | - fruits : ๊ณผ์ผ๋“ค์˜ ์žฌ๊ณ ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜<br>- increaseStock(of: by:) : ๊ณผ์ผ ์žฌ๊ณ ๋ฅผ ๋ณ€๊ฒฝ(์ฆ๊ฐ€)ํ•˜๋Š” ๋ฉ”์„œ๋“œ<br>- dereaseStock(of: by:) : ๊ณผ์ผ ์žฌ๊ณ ๋ฅผ ๋ณ€๊ฒฝ(๊ฐ์†Œ) ํ•˜๋Š” ๋ฉ”์„œ๋“œ<br>- checkStock(message:) : ๋ ˆ์‹œํ”ผ์—์„œ ์š”๊ตฌํ•˜๋Š” ์žฌ๋ฃŒ์˜ ์–‘๋ณด๋‹ค ์žฌ๊ณ ๊ฐ€ ๋งŽ์€์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ | |Label Class|์„ค๋ช…| | --- | --- | |`{๊ณผ์ผ๋ช…}StockLabel`|{๊ณผ์ผ๋ช…}Label ์ •์˜| |**Stepper Button class**|**์„ค๋ช…**| |`{๊ณผ์ผ๋ช…}Stepper`|{๊ณผ์ผ๋ช…}Stepper ๋ฒ„ํŠผ ์ •์˜| |**Order Button class**| **์„ค๋ช…** | |`{์ฅฌ์Šค๋ช…}Button`|{์ฅฌ์Šค๋ช…}Button ์ •์˜| | enum | ์—ญํ•  | | --- | --- | | `Errors` | - ์—๋Ÿฌ์ •์˜ | | `Fruits` | - ๊ณผ์ผ ์ข…๋ฅ˜ ์ •์˜<br>- 10๊ฐœ์”ฉ ๊ณผ์ผ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ | | `Juices` | - ๊ฐ ์ฅฌ์Šค ์ด๋ฆ„ ์ •์˜<br>- ์ฅฌ์Šค๋“ค์˜ ๋ ˆ์”จํ”ผ ์ •์˜ | | `Messages` | - Alert์— ๋…ธ์ถœ๋  ๋ฉ”์„ธ์ง€ ์ •์˜ | | protocol | ์—ญํ•  | | --- | --- | | `FruitStockManagable` | - ์žฌ๊ณ ๊ด€๋ฆฌ์— ๊ด€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์˜ ์ค€์ˆ˜์‚ฌํ•ญ ์ œ๊ณต | | `JuiceOrderable` | - ์œ ์ €์˜ ์ฃผ๋ฌธ์„ ๋ฐ›๋Š” ๊ฐ์ฒด๋“ค์˜ ์ค€์ˆ˜์‚ฌํ•ญ ์ œ๊ณต| <br> ## [Step 1] ์ฅฌ์Šค ๋ฉ”์ด์ปค ํƒ€์ž… ์ •์˜ ๐Ÿ“Œ [PR #21 | JuiceMaker [STEP 1] Logan, Blue](https://github.com/tasty-code/ios-juice-maker/pull/21) ### โœ… ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ - FruitStore ํƒ€์ž… ์ •์˜ - ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ผ: ๋”ธ๊ธฐ, ๋ฐ”๋‚˜๋‚˜, ํŒŒ์ธ์• ํ”Œ, ํ‚ค์œ„, ๋ง๊ณ  - ๊ณผ์ผ์˜ ์ดˆ๊ธฐ ์žฌ๊ณ : 10๊ฐœ - ๊ณผ์ผ ์ˆ˜๋Ÿ‰๋ณ€๊ฒฝ ๊ธฐ๋Šฅ - JuiceMaker ํƒ€์ž… ์ •์˜ - ๋ ˆ์‹œํ”ผ์— ๋งž์ถฐ ๊ณผ์ผ์ฃผ์Šค ์ œ์กฐ - ๊ณผ์ผ์˜ ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์ฅฌ์Šค ์ œ์กฐ ๋ถˆ๊ฐ€ - FruitStore๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์Œ ### โ˜„๏ธ ๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ 1. **`FruitStore`๋Š” ์™œ class๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ์„๊นŒ?** ๊ณผ์ œ๋ฅผ ์ฒ˜์Œ ๋ฐ›์•˜์„ ๋•Œย `class FruitStore {}`ย ํ˜•ํƒœ๋กœ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณด๊ณ ย **singleton**์œผ๋กœ๊ตฌํ˜„ํ•  ๊ฒƒ์„ ์˜๋„ํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€! ํ•˜์—ฌ ๊ตฌํ˜„ํ•ด ๋ณด๋ ค๊ณ  ํ•˜์˜€์Šต๋‹ˆ๋‹ค.`FruitStore`๋ฅผ singleton์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. - ๊ณผ์ผ ์žฌ๊ณ  ์ €์žฅ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ์ผ์ฅฌ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ณผ์ผ์„ ๊ฐ€์ ธ๋‹ค ์จ์•ผ ํ•จ - ๊ณผ์ผ์˜ ์žฌ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ํ•จ - ์œ„์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๋•Œย `FruitStore`๊ฐ€ ์•„๋‹Œย **์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ๊ฐ€๋Šฅ์„ฑ**์ด ์žˆ๊ณ , ํ•œ ๊ณณ์—์„œ ์žฌ๊ณ ๊ฐ€๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ,ย `singleton`์œผ๋กœ ๊ตฌํ˜„ํ•  ํ•„์š”์„ฑ ๋А๋‚Œ 2. **`JuiceMaker`๋Š” ์™œ struct๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”๊ฐ€?** ์•„๋ž˜์˜ ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ case ์ค‘ย **๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์ž์‹ ์„ ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ**์— ํ•ด๋‹นํ•œ๋‹ค๊ณ ์ƒ๊ฐํ•˜์—ฌ struct๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค. - ์• ํ”Œ์€ย [๊ฐ€์ด๋“œ๋ผ์ธ](https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes)์—์„œ ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•จ - ์—ฐ๊ด€๋œ ๊ฐ„๋‹จํ•œ ๊ฐ’์˜ ์ง‘ํ•ฉ์„ ์บก์Аํ™”ํ•˜๋Š” ๊ฒƒ๋งŒ์ด ๋ชฉ์ ์ผ ๋•Œ - ์บก์Аํ™”ํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•  ๋•Œ - ๊ตฌ์กฐ์ฒด์— ์ €์žฅ๋œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ’ ํƒ€์ž…์ด๋ฉฐ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•  ๋•Œ - ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์ž์‹ ์„ ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ <br> ## [Step 2] ์ดˆ๊ธฐํ™”๋ฉด ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๐Ÿ“Œ [PR #28 | JuiceMaker [STEP 2] Logan, Blue](https://github.com/tasty-code/ios-juice-maker/pull/28) ### โœ… ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ - ์žฌ๊ณ  ์ˆ˜์ • ๋ฒ„ํŠผ์— ์žฌ๊ณ ์ถ”๊ฐ€ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ - ์ฃผ๋ฌธ ๋ฒ„ํŠผ ํ„ฐ์น˜ ์‹œ - ์žฌ๊ณ ๊ฐ€ ์žˆ์œผ๋ฉด โ†’ โ€œ์ฅฌ์Šค ๋‚˜์™”์Šต๋‹ˆ๋‹ค! ๋ง›์žˆ๊ฒŒ ๋“œ์„ธ์š”!โ€ ์–ผ๋Ÿฟ ํ‘œ์‹œ - ์žฌ๊ณ ๊ฐ€ ์—†์œผ๋ฉด โ†’ โ€œ์žฌ๋ฃŒ๊ฐ€ ๋ชจ์ž๋ผ์š”. ์žฌ๊ณ ๋ฅผ ์ˆ˜์ •ํ• ๊นŒ์š”?โ€ ์–ผ๋Ÿฟ ํ‘œ์‹œ - ์˜ˆ โ†’ ์žฌ๊ณ  ์ˆ˜์ • ํ™”๋ฉด์œผ๋กœ ์ด๋™ - ์•„๋‹ˆ์˜ค โ†’ ์–ผ๋Ÿฟ ๋‹ซ๊ธฐ - ๊ณผ์ผ์ฅฌ์Šค ์ œ์กฐ์— ๋”ฐ๋ฅธ ์žฌ๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜ ### โ˜„๏ธ ๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ 1. **ํ™”๋ฉด ์ „ํ™˜ ๋ฐฉ์‹์œผ๋กœ ์™œ `Modal ๋ฐฉ์‹`์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๊ฐ€?** - ๊ธฐ์กด์— ์ œ์‹œ๋๋˜ ํžŒํŠธ๊ฐ€ `EditStockViewController`๋„ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - ํ•˜์ง€๋งŒ Modal ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์˜€๊ณ , ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. - ***โ€œ๋ชจ๋‹ฌ์€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค ์™€๋Š” ๋‹ฌ๋ฆฌ ์ •๋ณด์˜ ํ๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ์œ„ํ•ด ์ด๋ชฉ์„ ๋„๋Š” ๋ฐฉ์‹์ด๋‹ค.โ€*** ๋ผ๋Š” ์ •์˜์— ์˜๊ฑฐํ•˜์—ฌ ์žฌ๊ณ ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ–‰์œ„๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฐ„๋‹จํ•œ ์ž…๋ ฅ์œผ๋กœ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ - [Apple์˜ Human Interface Guideline](https://developer.apple.com/design/human-interface-guidelines/patterns/modality)์— ๋”ฐ๋ฅด๋ฉด **โ€œAim to keep modal tasks simple, short, and narrowly focused.โ€** ์— ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ โ€˜์žฌ๊ณ  ์ˆ˜์ •โ€™์€ ์ž‘์—…์˜ ๋ฒ”์œ„๊ฐ€ ๋‹จ์ˆœํ•˜๊ณ  ์ข์€ ๋ฒ”์œ„์˜ ํŽธ์ง‘์ด๊ธฐ ๋•Œ๋ฌธ - **โ€Help people perform a distinct, narrowly scoped task without losing track of their previous contextโ€,** ์‚ฌ์šฉ์ž๋“ค์ด ์ด์ „ ์ปจํ…์ŠคํŠธ๋ฅผ ์žƒ์ง€ ์•Š๊ณ  ๋ช…ํ™•ํ•˜๊ณ  ์ข์€ ๋ฒ”์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” HIG์— ์ง€์นจ์— ๋”ฐ๋ผ, โ€˜์žฌ๊ณ  ์ˆ˜์ •โ€™ ์ž‘์—…์€ ์ด์ „ ํ™”๋ฉด์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์žƒ์ง€ ์•Š๊ณ  ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ <br> ## [Step 3] ์žฌ๊ณ ์ˆ˜์ • ๋ฐ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๐Ÿ“Œ [PR #38 | JuiceMaker [STEP 3] Logan, Blue](https://github.com/tasty-code/ios-juice-maker/pull/38) ### โœ… ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ - ํ™”๋ฉด ์ œ๋ชฉ '์žฌ๊ณ ์ถ”๊ฐ€' ๋ฐ '๋‹ซ๊ธฐ' ๋ฒ„ํŠผ ๊ตฌํ˜„ - ๋‹ซ๊ธฐ ํ„ฐ์น˜ ์‹œ ์ด์ „ํ™”๋ฉด์œผ๋กœ ๋ณต๊ท€ - ์žฌ๊ณ ์ถ”๊ฐ€ ํ™”๋ฉด ์ง„์ž… ์‹œ ๊ณผ์ผ์˜ ํ˜„์žฌ ์žฌ๊ณ  ์ˆ˜๋Ÿ‰ ํ‘œ์‹œ - +, -๋ฅผ ํ†ตํ•œ ์žฌ๊ณ  ์ˆ˜์ • - iPhone12 ์™ธ์— ๋‹ค๋ฅธ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ UI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋„๋ก ์˜คํ†  ๋ ˆ์ด์•„์›ƒ ์ ์šฉ ### โ˜„๏ธ ๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ 1. STEP2์—์„œ๋Š” label ๋ฐ stepper๋ฅผ ํ•˜๋‚˜์”ฉ Outlet์œผ๋กœ ์„ ์–ธ ํ›„ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์„ ์–ธ๋ถ€๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด `Outlet Collection`์œผ๋กœ ๊ฐœ์„ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค! โช **ViewController.swift**์˜ ๊ธฐ์กด label ์„ ์–ธ๋ถ€ ์ฝ”๋“œ ```swift @IBOutlet weak var strawberryLabel: UILabel! @IBOutlet weak var bananaLabel: UILabel! @IBOutlet weak var pineappleLabel: UILabel! @IBOutlet weak var kiwiLabel: UILabel! @IBOutlet weak var mangoLabel: UILabel! ``` โฉ **Outlet Collection**์œผ๋กœ ์ˆ˜์ • ```swift @IBOutlet var fruitStockLabels: [UILabel]! ``` 2. `protocol`์„ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋กœ ์ •์˜๋˜๊ณ  Collection์œผ๋กœ ์—ฎ์ธ ๋ฒ„ํŠผ๋“ค์„ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ” **Protocols.swift** ```swift protocol FruitStockManagable { var fruitName: Fruits { get } } protocol JuiceOrderable { var juice: Juices { get } } ``` ์œ„์˜ ๋‘ `FruitStockManagable`, `JuiceOrderable`์€ ๊ฐ ๋ฒ„ํŠผ๋“ค์˜ ์ •์ฒด์„ฑ์„ ํ™•์ธํ•˜๋Š”๋ฐ ๊ผญ ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ” **FruitLabels.swift, FruitSteppers.swift, JuiceOrderButtons.swift** ```swift // JuiceMakerVC์˜ ์žฌ๊ณ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ผ๋ฒจ์˜ ํด๋ž˜์Šค ์ •์˜์ค‘ "๋”ธ๊ธฐ" class StrawberryStockLabel: UILabel, FruitStockManagable { var fruitName: Fruits = .strawberry // JuiceMakerVC์˜ ์ฃผ๋ฌธ ๋ฒ„ํŠผ ์ค‘ "๋”ธ๊ธฐ๋ฐ”๋‚˜๋‚˜์ฅฌ์Šค" class StrawberryJuiceButton: UIButton, JuiceOrderable { var juice: Juices = .strawberry } // EditStockVC์˜ ์žฌ๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฒ„ํŠผ StepperButton์˜ ์ •์˜์ค‘ ๋”ธ๊ธฐ ๋ถ€๋ถ„ class StrawberryStepper: UIStepper, FruitStockManagable { var fruitName: Fruits = .strawberry } } ``` 4. Alert ๋„์šฐ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. - ๊ธฐ์กด์—๋Š” ์„ ํƒ์ง€๊ฐ€ 1๊ฐœ์ธ(์˜ˆ) ์•Œ๋ฆผ์ฐฝ๊ณผ ์„ ํƒ์ง€๊ฐ€ 2๊ฐœ์ธ(์˜ˆ / ์•„๋‹ˆ์˜ค) ์•Œ๋ฆผ์ฐฝ์„ ๋‘๊ฐœ ๋”ฐ๋กœ ์„ ์–ธํ•˜์—ฌ ๋™์ž‘ํ–ˆ์ง€๋งŒ ๊ฐ™์€ ์ž‘์—…์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ 2๊ฐœ์ธ๊ฒƒ์ด ๋ฐ”๋žŒ์ง ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ดํ›„ ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์—์„œ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๐Ÿ” **ViewController.swift** ```swift private func popAlert(with message: String?, error: Error?) { if message != nil && error != nil { return } if let message { let alert = UIAlertController(title: message, message: nil, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "์˜ˆ", style: .default, handler: nil)) present(alert, animated: true) } if let error { let alert = UIAlertController(title: error.localizedDescription, message: nil, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "์˜ˆ", style: .default, handler: {_ in self.moveToEditStockView()})) alert.addAction(UIAlertAction(title: "์•„๋‹ˆ์˜ค", style: .destructive, handler: nil)) present(alert, animated: true) } } ``` <br> ## ๐Ÿ—๏ธย ํ•™์Šต ํ‚ค์›Œ๋“œ - string.index - enum - rawValue์˜ ์‚ฌ์šฉ - Singleton - ์—๋Ÿฌ ํ•ธ๋“ค๋ง (`do-catch`, `try`) - Navigation bar item - Alert controller - Modality - Auto Layout - Custom Class - Outlet Collection - Type Casting - Stepper <br> ## ๐Ÿ’™ Team Bu-Lo ๐Ÿ€ ๐Ÿƒ๐Ÿป๐Ÿƒ๐Ÿปโ€โ™‚๏ธ๐Ÿ’จ **ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„:** `23.01.02` ~ `23.01.13` |<img src="https://avatars.githubusercontent.com/u/71758542?v=4" width=200>|<img src="https://avatars.githubusercontent.com/u/29590768?v=4" width=200>| |:---:|:---:| |[๐Ÿ’™ Blue ๐Ÿ’™](https://github.com/bomyuniverse)|[๐Ÿ€ Logan ๐Ÿ€](https://github.com/sloDevz)|