13 Nov 2017
|
swift
์ธ์คํด์ค
๊ฐ์ฒด
์ค๋ 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 ๊ฐ์ฒด ๋ง๋๋ ๋ถ๋ถ)
13 Nov 2017
|
guard
swift
optional
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
*/