Giter Club home page Giter Club logo

ios_juicemaker's Introduction

๐Ÿ“ ์ฅฌ์Šค๋ฉ”์ด์ปค ํ”„๋กœ์ ํŠธ

ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„: 2021.10.18 ~ 2021.11.05

๋ชฉ์ฐจ

STEP 1

๊ณ ๋ฏผ๋˜์—ˆ๋˜ ์  ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1

Nested Type

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

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : Nested Type์œผ๋กœ ๊ตฌํ˜„

Fruit ํƒ€์ž…์€ FruitStore ํƒ€์ž… ๋‚ด์— ์„ ์–ธํ•˜๊ณ , Juice ํƒ€์ž…์€ JuiceMaker ํƒ€์ž… ๋‚ด์— ์„ ์–ธํ•˜์—ฌ ๊ฐ ์ƒ์œ„ ํƒ€์ž… ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ ‘๊ทผ ์ œ์–ด์ž(์€๋‹‰ํ™”)

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

์—๋Ÿฌ ํ•ธ๋“ค๋ง

์–ด๋–ค ์ƒํ™ฉ, ์–ด๋–ค ๋ฉ”์„œ๋“œ์—์„œ ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์•ผํ• ์ง€ ๊ณ ๋ฏผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์—๋Ÿฌ์˜ ์ข…๋ฅ˜๋ฅผ ๋จผ์ € ์ •๋ฆฌํ•˜์—ฌ JuiceMakeError ํƒ€์ž…์— ์„ ์–ธํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์„ ์–ธํ•œ ์—๋Ÿฌ ์ผ€์ด์Šค์— ๋”ฐ๋ผ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ try, throws๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋˜ ๋ถ€๋ถ„์€ Bool ํƒ€์ž…๋„ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅํ•˜๊ณ  ์—๋Ÿฌ๋„ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์˜€์Šต๋‹ˆ๋‹ค.

func checkEnoughStock(of fruit: Fruit, requiredAmount: Int) throws -> Bool {
    guard let fruitCounts = stock[fruit] else {
        throw JuiceMakeError.invaildKey
    }

    guard fruitCounts >= requiredAmount else {
        return false
    }

    return true
}

๊ธฐ์กด์— guard ๋ฌธ์˜ else์—๋Š” ๋ชจ๋‘ ์—๋Ÿฌ๋ฅผ ๋˜์ง€๋„๋ก ํ•˜์˜€์œผ๋‚˜, false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ true/false๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์ž์œจ์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

guard fruitCounts >= requiredAmount else {
    return false
}

guard vs if

guard์™€ if๋ฌธ ์‚ฌ์ด์—์„œ ๊ณ ๋ฏผ์ด ๋˜์—ˆ์„ ๋•Œ๋Š” ํ˜„์žฌ ๋น ๋ฅธ ์ข…๋ฃŒ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ธ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ€๋…์„ฑ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ guard๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ guard๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Initializer

๊ธฐ์กด์—๋Š” FruitStore์˜ ์žฌ๊ณ ๋ฅผ ์ผ์ผ์ด ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐฉ์‹์œผ๋กœ ๊ฐ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๊ฐœ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ์œผ๋‚˜, ์ถ”ํ›„ ์ผ€์ด์Šค๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ enum์— CaseIterable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜์—ฌ ๋ชจ๋“  case๋ฅผ ๋ฐ˜ํ™˜ํ•˜์˜€๊ณ , ์ด์— ๋Œ€ํ•˜์—ฌ ์ผ๊ด„์ ์œผ๋กœ ์žฌ๊ณ  ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Step 2

๊ณ ๋ฏผ๋˜์—ˆ๋˜ ์  ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2

stock์˜ ์ ‘๊ทผ ์ œ์–ด์ž

stock์˜ ๊ฐ’์„ ์กฐํšŒ(get)ํ•˜๋Š” ํ–‰์œ„๋Š” ํ—ˆ์šฉํ•ด์ค˜๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๊ฐ’์€ ๋ณ€๊ฒฝ(set)ํ•˜๋Š” ๊ฒƒ๋งŒ ๋ฐฉ์ง€ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: private(set) ์ ‘๊ทผ ์ œ์–ด์ž ์ถ”๊ฐ€

๊ฐ’์„ ์ฝ๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ์„ค์ •ํ•˜๊ณ , ๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ FruitStore ๋‚ด์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด์ฃผ์–ด ์™ธ๋ถ€์—์„œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

AlertAction์˜ ์œ„์น˜

์ทจ์†Œ ๋ฒ„ํŠผ๊ณผ ์žฌ๊ณ  ์ˆ˜์ • ๋ฒ„ํŠผ์˜ ์œ„์น˜๋ฅผ ๊ฐ๊ฐ ์–ด๋””์— ๋ฐฐ์น˜ํ•ด์•ผํ•  ์ง€ ๊ณ ๋ฏผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: HIG - Alert ๋ฌธ์„œ ํ™•์ธ

HIG ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ "์ทจ์†Œ" ๋ฒ„ํŠผ์€ ํ•ญ์ƒ ์™ผ์ชฝ์— ์œ„์น˜ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์žˆ์–ด ์ทจ์†Œ ๋ฒ„ํŠผ์„ ์™ผ์ชฝ์œผ๋กœ, ์žฌ๊ณ  ์ˆ˜์ • ๋ฒ„ํŠผ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

STEP 3

๊ณ ๋ฏผ๋˜์—ˆ๋˜ ์  ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 3

singleton์— ๋Œ€ํ•˜์—ฌ

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

๋ทฐ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

๋ทฐ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ NotificationCenter๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ„๋‹จ ๋ช…๋ฃŒํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์— modal์„ presentํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ completion์— post๋ฅผ ํ•ด์ฃผ๊ณ , modifyStockViewController์˜ viewDidLoad์—์„œ addObserver๋ฅผ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ modifyStockViewController๋ฅผ ๋„์› ์„ ๋•Œ label์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‹œ๊ฐ„์— ํ…€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— view life cycle์„ ํ™œ์šฉํ•ด์„œ ํ•ด๊ฒฐ์„ ํ•ด๋ณด๊ณ ์ž post๋ฅผ JuiceMakerViewController์˜ viewWillDiasappear์— ์ ์–ด์ฃผ์–ด ํ•ด๊ฒฐ์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— modal์ด page sheet ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ฏผ์„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ์—๋Š” segue๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ prepare์—์„œ stock์„ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

์Šคํ† ๋ฆฌ๋ณด๋“œ ๋ถ„๋ฆฌ์— ๋”ฐ๋ฅธ storyboard

storyboard๋ฅผ viewController ๋ณ„๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์ง„ํ–‰ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์ด์•ผ๊ธฐํ–ˆ๋˜ ๋ถ€๋ถ„๊ณผ ๊ฐ™์ด ๊ฒฐ๊ตญ์—๋Š” segue๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด storyboard reference๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜คํ† ๋ ˆ์ด์•„์›ƒ

์ž‘์€ ํ•ด์ƒ๋„์˜ ๊ธฐ๊ธฐ์—์„œ๋Š” UIButton์˜ ํ…์ŠคํŠธ๊ฐ€ ์ผ๋ถ€ ์ƒ๋žต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด .lineBreakMode๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‘ ์ค„๋กœ ํ‘œํ˜„๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ios_juicemaker's People

Contributors

chaminlee avatar oksunwoo avatar forestjae avatar yagom 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.