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

TIL_20171115

|

์˜ค๋Š˜ ๋ฐฐ์šด/๋Š๋‚€ ๊ฒƒ

  • ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„
    • ์—๋Ÿฌ ๋ฐœ์ƒ ์ƒํ™ฉ์„ ์กฐ๊ธˆ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์—๋Ÿฌ๋ฐœ์ƒ ์ƒํ™ฉ์€ ๊ฑฐ์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์—์„œ ์ผ์–ด๋‚  ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— player ์ด๋ฆ„์ด๋‚˜ ์‚ฌ๋‹ค๋ฆฌ ๋†’์ด๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์•ž์œผ๋กœ ํ•  ๊ฒƒ

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

TIL_20171114

|

์˜ค๋Š˜ ๋ฐฐ์šด / ๋Š๋‚€ ๊ฒƒ

  • ์‚ฌ๋‹ค๋ฆฌ๊ฒŒ์ž„
    • inputView์— ์—๋Ÿฌํ•ธ๋“ค๋ง ์ ์šฉ
    • ๋žœ๋คํ•œ Bool๊ฐ’์œผ๋กœ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋กœ์ง์„ ๋” ๊ฒฌ๊ณ ํ•˜๊ฒŒ(?) ์ˆ˜์ •ํ–ˆ๋‹ค. ์˜ˆ์ „์—๋Š” ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ฐ”๋กœ ์˜† ์นธ์˜ ๊ฐ™์€ ๋†’์ด์— ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์ƒ๊ฒจ๋„ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ ์‹ค์ œ์ƒํ™ฉ์—์„œ๋Š” ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ๊ฑฐ์˜ ๊ทธ๋ ‡๊ฒŒ ๊ทธ๋ฆฌ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์—โ€ฆ

์•ž์œผ๋กœ ํ•  ๊ฒƒ

  • ์œ ๋‹›ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์—ฐ์Šตํ•˜๊ธฐ. (์ •๋ง ์•„๋ฌด๋ฆฌ ํ•ด๋„ ๊ฐ์ด ์•ˆ์˜จ๋‹ค. ์–ด๋ ต๋‹ค ใ… ใ… ใ… )
  • ์‚ฌ๋‹ค๋ฆฌ๊ฒŒ์ž„ ๋ฏธ์…˜์ด ๋นจ๋ฆฌ ๋„˜์–ด๊ฐ€๋Š”๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ๊ฒƒ ๊ฐ™๋‹ค. ์–ด์„คํ”„๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋” ์–ด๋ ค์šด ๋ฏธ์…˜์—์„  ๋” ํ—ค๋งฌ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์—
  • ํ—ˆ๋ฆฌ ํ†ต์ฆ์ด ์ •๋ง ๋„ˆ๋ฌด ์‹ฌํ•ด์กŒ๋‹ค. ๊ผญ๊ผญ ํ—ˆ๋ฆฌ ์ŠคํŠธ๋ ˆ์นญ๊ณผ ์š”๊ฐ€ ๋ฐค์— ํ•ด์•ผ์ง€!

TIL_20171113

|

์˜ค๋Š˜ ๋ฐฐ์šด / ๋Š๋‚€ ๊ฒƒ

  • ์‚ฌ๋‹ค๋ฆฌ๊ฒŒ์ž„
    • ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ
    • Data Object ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ : ์ž…๋ ฅ๋ฐ›๋Š” ๊ฐ์ฒด์˜ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟˆ
    • ๋งˆ์Šคํ„ฐ์™€ ๋ฏธํŒ…์„ ํ–ˆ๋‹ค. ํ˜ผ์ž ์ฐพ์•„๋‚˜๊ฐ€๊ณ  ์ ๊ทน์ ์ธ ์งˆ๋ฌธ๋ฐฉ์‹์— ๋”์šฑ ๋” ์ ์‘ํ•˜๊ธฐ / ๋‚ด ํŽ˜์ด์Šค ์žƒ์ง€ ๋ง๊ธฐ!

์•ž์œผ๋กœ ํ•  ๊ฒƒ

  • ๋ฏธ์…˜ ์ง„ํ–‰์ด ์ค‘์š”ํ•œ๊ฑด ๋งž์ง€๋งŒ ๋‚˜์—๊ฒ ๊ธฐ์ดˆ๋ฅผ ์Œ“๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•จ. ํ•˜๋ฃจ ์ผ๊ณผ ์ค‘ ๋ฏธ์…˜ ์ง„ํ–‰ ์‹œ๊ฐ„๊ณผ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„ ๋น„์œจ์„ ์ •ํ•ด๋ดค๋‹ค.
    • 50%: ๋ฏธ์…˜ ์ง„ํ–‰
    • 40%: ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„
    • 10% : ์ „๋‚  ํšŒ๊ณ , ๋‹ค์Œ ๋‚  ํ•  ๊ฒƒ ์ •ํ•˜๊ธฐ
  • ์•ž์œผ๋กœ ์ž˜ ์ง€ํ‚ค๋Š”๊ฒŒ ๋ชฉํ‘œ!

๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋•Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด (Data Object์˜๊ฒฝ์šฐ)

|

์˜ค๋Š˜ main์—์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋•Œ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

//main.swift

var inputView = InputView()
var gameOption = GameOption(inputView.userInput()) 

//userInput()์˜ ๋ฆฌํ„ด๊ฐ’๋งŒ ๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์ฃผ๊ณ   GameOption์˜ init์ด ์‹คํ–‰๋˜๋ฉด์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด userInput์˜ ๋ฆฌํ„ด๊ฐ’ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ๊ทธ ๋‹ค์Œ GameOption์˜ init์ด ์‹คํ–‰๋˜๋ฉด์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” (๊ฐ’๋งŒ ๋„˜๊ธฐ๋ฉด ๋˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์ค‘๋ณต๋˜๋Š”)๊ณผ์ •์ด ์‹คํ–‰๋จ.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ userInput()์ด GameOption์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด main์—์„œ ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ• ์ˆ˜์žˆ์Œ

//main.swift
//inputView์™€ gameOption๋ถ€๋ถ„๋งŒ ๋ณด์ž!

var inputView = InputView()
var gameOption : GameOption = inputView.userInput()
var ladderGame = LadderGame(gameOption)
var ladderInfo : LadderInfo = ladderGame.genarateLadder()
var result = ResultView(ladderInfo)

์ด๋•Œ userInput()์˜ ๋ฆฌํ„ด๊ฐ’์€ GameOption์„ ๋ฆฌํ„ดํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

//InputView.swift

struct InputView {
    
    func userInput() -> GameOption {
        print("์ฐธ์—ฌํ•  ์‚ฌ๋žŒ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”. (์ด๋ฆ„์€ ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•˜์„ธ์š”)")
        let players = readLine()
        let playerNames = players!.split(separator: ",").map(String.init)
        print("์ตœ๋Œ€ ์‚ฌ๋‹ค๋ฆฌ ๋†’์ด๋Š” ๋ช‡ ๊ฐœ์ธ๊ฐ€์š”?")
        let ladderHeight = Int(readLine()!)
        let inputValue = (playerNames, ladderHeight!)
        let gameOption = GameOption(inputValue)
        
        return gameOption
    }

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด userInput์˜ ๋ฆฌํ„ด๊ฐ’์ด ๋ฐ”๋กœ GameOptionํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ด๋˜๋ฉด์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง. ์œ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต์ƒํ™ฉ(userInput์˜ ๋ฆฌํ„ด๊ฐ’์ด ์–ด๋–ค ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ฆฌํ„ด๋˜๋Š”)์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.

์‚ฌ๋‹ค๋ฆฌ๊ฒŒ์ž„์—์„œ ๋‚˜๋Š” ์ฃผ๋กœ Data Object์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๋•Œ ๋กœ์ง ๊ฐ์ฒด์—์„œ ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ–ˆ๊ณ , Data ๊ฐ์ฒด๊ฐ€ ๋กœ์ง ๊ฐ์ฒด๋กœ ๋„˜์–ด๊ฐˆ๋•Œ๋Š” ๋กœ์ง๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ’์„ ํ•„์š”ํ•œ Data Object๋กœ๋งŒ ์ •ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒผ๋‹ค.(LadderGame์ด๋‚˜ ResultView ๊ฐ์ฒด ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„)

guard์˜ ํšจ์šฉ - early exit! / ์˜ต์…”๋„๋ฐ”์ธ๋”ฉ

|

guard์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด์„œ

guard๋Š” else๋ฌธ์—์„œ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๋™์ž‘์„ ํ• ๋•Œ ํšจ์šฉ์ด ์žˆ๋‹ค.

guard๋ฅผ ์“ฐ๋˜ ๊ณณ์—์„œ ์›๋ž˜ ํ•˜๋˜ return์„ ์•ˆํ•˜๋‹ˆ (= ํ•จ์ˆ˜๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋ฒ„๋ฆฌ์งˆ ์•Š์œผ๋‹ˆ) ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. ์•Œ์•„๋ณด๋‹ˆ else๋ฌธ์— return์ด ์—†์–ด์„œ ๋‚˜๋Š” ์—๋Ÿฌ์˜€๋Š”๋ฐ, ๋‚ด ์ฝ”๋“œ๋Š” else์—์„œ return์„ ํ•ด๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๋Š” ๋กœ์ง์ด์—ˆ๋‹ค.

  • ๋งŒ์•ฝ guard (ํ˜น์€ guard - let)๋ฅผ ์“ด๋‹ค๋ฉด else๋ฌธ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๋™์ž‘์ด ์žˆ์„๋•Œ๋งŒ ํšจ์šฉ์ด ์žˆ์Œ : guard ๋ฐ”๋กœ ๋’ค์˜ ๊ตฌ๋ฌธ์ด ๋งŒ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ์‹œ์ผœ๋ฒ„๋ฆฌ๋Š” ๋กœ์ง์—๋งŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป
  • else๋ฌธ์—์„œ ํ•จ์ˆ˜๋ฅผ๋‚˜๊ฐ€์ง€ ์•Š๊ณ  ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜์•ผ ๋˜๋Š” ๋กœ์ง์˜ ๊ฒฝ์šฐ๋Š” if (ํ˜น์€ if- let)์„ ์จ์•ผํ•จ
  • early exit์ด๋ผ๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ์˜ต์…”๋„๋ฐ”์ธ๋”ฉ์—์„œ๋„ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
    guard let์„ ์‚ฌ์šฉํ•œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์€
    guard let afterValue = beforeValue else {return T}
    ์ด๋Ÿฐ์‹์œผ๋กœ ์“ฐ์ด๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ›๋Š” input๊ฐ’์ด nil์ด๋ฉด ๋‹ค์Œ ๋กœ์ง์ด ์‹คํ–‰๋  ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ return์œผ๋กœ ๋๋‚ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋‹ค.
    ์ด๋Ÿฐ ๋ฉด์—์„œ ์˜ต์…”๋„ ๊ฐ’์„ ์–ธ๋ž˜ํ•‘ํ–ˆ์„๋•Œ ๊ฐ’์ด nil์ด๋ฉด early exitํ•ด๋ฒ„๋ฆฌ๋Š”๊ฒŒ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ๊ฐ„ํŽธํ•œ ์˜ต์…”๋„๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์‹ค์ˆ˜ ํ–ˆ์—ˆ๋˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์—!

<1>

์‚ฌ๋‹ค๋ฆฌ ์—ฐ์Šต์ค‘์— if-else๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  guard๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ฏธ์…˜์ด ์žˆ์–ด์„œ guard๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. ์‚ฌ์šฉํ–ˆ๋˜ ํ•จ์ˆ˜๋Š” ์‚ฌ๋‹ค๋ฆฌ ์ค‘๊ฐ„์˜ randomBar๋ฅผ ๋งŒ๋“œ๋Š” ๋™์ž‘์—์„œ ์ฒ˜์Œ์—” String์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์˜€๋‹ค.

//๋ฆฌํ„ด๊ฐ’์ด ์žˆ๋˜ ์ „ ํ•จ์ˆ˜. ์—๋Ÿฌ๊ฐ€ ์—†์—ˆ์Œ
mutating func makeRandomBar() -> String {
  for _ in 1..<players.count {
    guard Int(arc4random_uniform(2)) == 0 else {
         return "     "
    }
    return "-----"
  }
}
<2>

๊ทธ๋Ÿฐ๋ฐ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด์„œ String์„ ๋ฆฌํ„ดํ•˜๋Š” ๋Œ€์‹ ์— [Bool]ํƒ€์ž…์˜ ์–ด๋ ˆ์ด์— Bool๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜์—ˆ๊ณ  guard์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. > else์—์„œ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ง€ ์•Š์œผ๋‹ˆ๊นŒ ๋‚˜๋Š” ์—๋Ÿฌ์˜€์Œ.

 //์‚ฌ๋‹ค๋ฆฌ ํ•œ ์ธต์—์„œ ์‚ฌ์ด์‚ฌ์ด bar๋ฅผ ๋žœ๋ค์œผ๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜.
    mutating func makeRandomBar() {
        for _ in 1..<players.count {
            guard Int(arc4random_uniform(2)) == 0 else {
                randomBars.append(false)
            }
            randomBars.append(true)
        }
    }
/*
์—๋Ÿฌ๋ฉ”์‹œ์ง€
'guard' body may not fall through, consider using a 'return' or 'throw' to exit the scope
*/