์๋ ํ์ธ์ ๊ฐ์์ ๋๋ค. ์ค๋๋ง์ ์ค์ํํธ ๊ณต์๋ฌธ์ ์ ๋ฆฌ๊ธ๋ก ๋์์์ด์. ์ฌ์ค ๊ณต์๋ฌธ์๊ฐ ๊ธธ๊ณ ๊ธฐ์ด๊ณต๋ถ๋ผ ์ฌ๋ฏธ์๋ ๋ฏํ ๋๋์ ์ค์.. (์ ๋ฆฌ์ค๋๊ฑธ๋ฆผ) ์ต๋ํ ์๊ฐ๋จ์ผ๋ฉด ์งํํ๋ ํธ์ผ๋ก ํ์๋๋ฐ, ์ ๊ฐ ์ ํ ์์นด๋ฐ๋ฏธ์ ์ ๊ณผํ๊ฒ ๋๋ฉด์! ์๊ฐ์ด ์ข ๋จ๊ฒ๋์์ด์. ๊ทธ๋์ ์ ๊ณผ ์ ์ ๋ชจ๋ ์ค์ํํธ ๊ณต์ ๋ฌธ์๋ฅผ ์ ๋ ํ๊ณ ๊ธฐ์ด๋ฅผ ํํํํํ๊ฒ ๋ค์ ธ๋ณด๊ณ ์ ๋ถ์ง๋ฐํ ์ ๋ฆฌ์ค์ ์์์ต๋๋ค.
๊ทผ๋ฐ ๋ง์นจ!! ์ค์ํํธ ๊ฐ๋ฐ์๋ค๋ง ๋ชจ์ฌ์๋ ์คํ์ฑํ ๋ฐฉ์ด ์๋๋ฐ, ๊ทธ ํก๋ฐฉ์์ ํด๋น ๋ฌธ์๋ฅผ ํ๋ฃจ์ ํ ์ฑํฐ์ฉ ๋ชจ์ฌ์ ์คํฐ๋ํ์๋ ์คํฐ๋ ๋ชจ์ง๊ธ์ด ์ฌ๋ผ์๊ณ ์ผ๋ฅธ ์ง์ํด์ ์คํฐ๋์ ์ฐธ์ฌํ๊ฒ๋์์ด์~! ํธํธํ
์์ฆ ๊ทธ๋์ ์คํฐ๋๋ ์งํํ๋ฉด์ ๊ณต์๋ฌธ์๋ ์ ๋ ํ๊ณ , ๊ฐ๋ฐ๋ ํ๊ณ , ์์ฃผ ๊ฐ์์ ์ด๊ณ ์์ต๋๋ค. ๊ทธ๋ผ ์คํฐ๋ํ๋ฉด์ ์ ๊ฐ ์ ๋ฆฌํ ๊ธ์ ๋ณด์์ฃ !
Swift Document chapter.05 Control Flow
Control Flow (์ ์ด ํ๋ฆ)
์ค์ํํธ์์๋ ์๋์ ๊ฐ์ ๋ค์ํ ์ ์ด ํ๋ฆ๋ฌธ์ ์ ๊ณตํ๋ค.
- While : ์๋ฌด๋ฅผ ์ฌ๋ฌ๋ฒ ์ํํ๋ ๋ฐ๋ณต๋ฌธ
- if, guard, switch : ์ ํด์ง ์กฐ๊ฑด์ ๊ธฐ์ด๋ก ํ์ฌ ์๋ก ๋ค๋ฅธ ์ฝ๋ ๋ถ๊ธฐ๋ฅผ ์คํํ๋ ์กฐ๊ฑด๋ฌธ
- break, continue : ์คํ ํ๋ฆ์ ์ฝ๋ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ ๋ฌํ๋ ์ญํ
- for - in : ๋ฐฐ์ด, ๋์ ๋๋ฆฌ, ๋ฒ์, ๋ฌธ์์ด ๋ฐ ์ํ์ค๋ค์ ์ฝ๊ฒ ๋ฐ๋ณตํ๋๋ก ํ๋ ๋ฐ๋ณต๋ฌธ
For-in Loops (for-in ๋ฐ๋ณต๋ฌธ)
๋ฐฐ์ด์ ํญ๋ชฉ, ์์น ๋ฒ์ ๋๋ ๋ฌธ์์ด๊ฐ์ ์ํ์ค๋ฅผ ๋ฐ๋ณตํ๋ ค๊ณ ํ ๋ ์ฌ์ฉํ๋ค.\
let names = ["A", "B", "C", "D"]
for name in names {
print("This is \\(name)!.")
}
์์ฒ๋ผ ์ํ์ค์์ ๊ฐ๊ฐ์ ๊ฐ์ด ํ์ํ์ง๋ ์์ ๊ฒฝ์ฐ์, ๋ณ์ ์ด๋ฆ ์๋ฆฌ์ ๋ฐ์ค(_)์ ์ฌ์ฉํ์ฌ ๊ทธ ๊ฐ์ ๋ฌด์ํ ์ ๋ ์๋ค.
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer += base
}
์ํ์ง ์๋ ๋๊ธ์ ๊ท์น์ ์ผ๋ก ๊ฑด๋๋ฐ๋ ค๋ฉด stride(from:to:by:)ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ํด๋น ํจ์๋ 0๋ถํฐ 60 ์ฌ์ด์ ๊ฐ์ ๋ฆฌํดํ๋ค.
stride(from:through:by:) ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ซํ ๋ฒ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
let minuteInterval = 5
for tickMark in stride(from:0, to: 60, by: minuteInterval) {
// 0, 5, 10, 15, ... 45, 50, 55
}
let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
// 3 ์๊ฐ๋ง๋ค ๋๊ธ์ ๊ทธ๋ฆผ (3, 6, 9, 12)
}
While Loops (while ๋ฐ๋ณต๋ฌธ)
๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด์ด false๊ฐ ๋ ๋๊น์ง ์ผ๋ จ์ ๊ตฌ๋ฌธ ์งํฉ์ ์ํํ๋ค. ์ฒซ๋ฒ์งธ ํ์ฐจ์ ์์ ์ ์ ๋ฐ๋ณต ํ์๋ฅผ ์ ์ ์์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค. ์ค์ํํธ์์๋ ๋๊ฐ์ง while ๋ฌธ์ ์ ๊ณตํ๋ค.
- while ๋ฐ๋ณต๋ฌธ ํต๊ณผ๋ฅผ ์์ํ ๋๋ง๋ค ์กฐ๊ฑด์ ํ๊ฐํ๋ค.
- repeat-while ๋ฐ๋ณต๋ฌธ ํต๊ณผ๊ฐ ๋๋ ๋๋ง๋ค ์กฐ๊ฑด์ ํ๊ฐํ๋ค.
While ๋ฌธ
๋จ์ผ ์กฐ๊ฑด์ ํ๊ฐํจ์ผ๋ก์จ ์์ํ๋ค. ์กฐ๊ฑด์ด true๋ฉด ์กฐ๊ฑด์ด false๊ฐ ๋ ๋๊น์ง ์ผ๋ จ์ ๊ตฌ๋ฌธ ์งํฉ์ ์คํํ๋ค. ์ผ๋ฐ์ ์ธ ํํ๋ ์๋์ ๊ฐ๋ค.
while (์กฐ๊ฑด) {
statemens๊ตฌ๋ฌธ
}
์์๋ก ๋ฏธ๋๋ผํ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์์ ๊ตฌํํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
25๋ฒ์นธ์ ๋์ฐฉํ๊ฑฐ๋ ๋์ด๊ฐ์ผ ๊ฒ์์ด ์ข ๋ฃ๋๊ณ , ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๊ฒ์์ ์งํํ๋ค. ๋ฐ๋ผ์ ์ฃผ์ฌ์๋ฅผ ๋ช ๋ฒ ๊ตด๋ฆฌ๋์ง ์ ํํ๊ฒ ์ ์ ์์ผ๋ฏ๋ก, while ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
25๋ฒ์นธ์ ๋์ฐฉํ๊ฑฐ๋ ๋์ด๊ฐ์ผ ๊ฒ์์ด ์ข ๋ฃ๋๊ณ , ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๊ฒ์์ ์งํํ๋ค. ๋ฐ๋ผ์ ์ฃผ์ฌ์๋ฅผ ๋ช ๋ฒ ๊ตด๋ฆฌ๋์ง ์ ํํ๊ฒ ์ ์ ์์ผ๋ฏ๋ก, while ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
// 1๋ฒ์ ์ผ์ชฝ๋ถ๋ถ์ ์๋ 0๋ฒ์นธ์์ ๋ง์ด ์ถ๋ฐํ๋ฏ๋ก finalSquare์ 26์ด ๋์ด์ผํ๋ค.
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
while square < finalSquare {
// ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆผ
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
// ๊ตด๋ฆฐ ์๋งํผ ์ด๋ํจ
square += diceRoll
if square < board.count {
// ์ฌ์ ํ ๊ฒ์ ํ ์๋ฉด, ๋ฑ์ด๋ ์ฌ๋ค๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ค๋ฅด๋ด๋ฆผ
square += board[square]
}
}
print("Game over!")
Repeat-While ๋ฌธ
while ๋ฐ๋ณต๋ฌธ์ด ๋ค๋ฅด๊ฒ ๋ณํํ ํํ์ด๋ค. ๋ฐ๋ณต ์กฐ๊ฑด์ ๊ณ ๋ คํ๊ธฐ ์ ์ ์ฒ์์ ๋ฐ๋ณต๋ฌธ ๋ธ๋ญ์ ํ ๋ฒ ํต๊ณผํ๋ค. ๊ทธ๋ฐ ๋ค์์ false๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค. ๋ค๋ฅธ ์ธ์ด์ do-while๋ฌธ๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ฐ๋๋ค.
repeat {
statements-๊ตฌ๋ฌธ
} while (์กฐ๊ฑด)
repeat-while๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ ์ฌ๋ค๋ฆฌ๊ฒ์์ ์ฝ๋๋ฅผ ๋ณํ์ํฌ ์ ์๋ค. ์ ์ฝ๋์์๋ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฌ๊ณ , if ๋ฌธ์ ํ์ฉํ์ฌ ๋ฑ์ธ์ง ์ฌ๋ค๋ฆฌ์ธ์ง ๊ตฌ๋ณํ์๋ค. ํ์ง๋ง repeat-while๋ฌธ์ ์ฌ์ฉํ๋ฉด, ์ด๋ฐ์ ๋ฑ์ธ์ง ์ฌ๋ค๋ฆฌ์ธ์ง ๊ฒ์ฌํ ํ์, ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆด ์ ์๋ค.
repeat {
// ๋ฑ์ด๋ ์ฌ๋ค๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ค๋ฅด๋ด๋ฆผ
square += board[square]
// ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆผ
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
// ๊ตด๋ฆผ ์์ ๋ฐ๋ผ ์ด๋ํจ
square += diceRoll
} while square < finalSquare
print("Game over!")
Conditional Statements (์กฐ๊ฑด๋ฌธ)
์ ํด์ง ์กฐ๊ฑด์ ๊ธฐ์ด๋ก ์๋ก ๋ค๋ฅธ ์ฝ๋ ์กฐ๊ฐ์ ์คํํ ๋ ์ ์ฉํ๋ค. ์ค์ํํธ์์๋ if ๋ฌธ๊ณผ switch ๋ฌธ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์กฐ๊ฑด๋ฌธ์ ์ ๊ณตํ๋ค.
- if ์ ์ ๊ฒฐ๊ณผ๋ง ๋ฐ์ ๊ฐ๋ฅํ ๋จ์ํ ์กฐ๊ฑด ํ๊ฐ์์ ์ฌ์ฉ
- switch ์ฌ๋ฌ ์์๋ก ๋ฐ์ ๊ฐ๋ฅํ ๋ ๋ณต์กํ ์กฐ๊ฑด์ ์ ํฉ, ํจํด ๋งค์นญ์ด ์คํํ ์ ์ ํ ์ฝ๋์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ
if ๋ฌธ
ํด๋น ์กฐ๊ฑด์ด true ์ผ ๋๋ง ๊ตฌ๋ฌธ ์งํฉ์ ์คํํ๋ค.
var temperture = 30
if temperture >= 32 {
print("too hot")
}
if ์กฐ๊ฑด์ด false ์ธ ์ํฉ์ ์ํด์ else ์ ์ด๋ผ๋ ๋์ ๊ตฌ๋ฌธ ์งํฉ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ธ ์ ์ ๊ณ ๋ คํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ if ๋ฌธ์ ์ฐ์ํ ์ ์๋ค.
if temperture >= 32 {
print("too hot")
} else if temperture < 32 {
print("์ ์")
} else {
print("cold")
}
์ถ๊ฐ์ ์ผ๋ก ๋ง์ง๋ง else์ ์ ์ต์ ์ด๋ฉฐ, ์กฐ๊ฑด์งํฉ์ ์๋ฃํ ํ์๊ฐ ์์ผ๋ฉด ๋ฐฐ์ ํ๊ณ ์์ฑํ์ฌ๋ ๋๋ค.
switch ๋ฌธ
์ผ์น ๊ฐ๋ฅํ ์ฌ๋ฌ ํจํด๊ณผ ๊ฐ์ ๊ฐ์ ๋น๊ตํ๊ณ ๊ณ ๋ คํ ๋ ์ฌ์ฉํ๋ค. if๋ฌธ์ ๋์์ผ๋ก ์ฌ๋ฌ๊ฐ์ ์ ์ฌ์ ์ธ ์ํ์ ๋ํ ์๋ต์ ์ ๊ณตํ๋ค. ํ๋์ ๊ฐ์ ๋๊ฐ์ ํ์ ์ ํ๋ ์ด์์ ๊ฐ๋ค๊ณผ ๋น๊ตํ๋ค.
switch (๊ณ ๋ คํ ๊ฐ) {
case value1:
value1์ผ ๋์ ์๋ต
case value2:
value2์ผ ๋์ ์๋ต
case value3:
value3์ผ ๋์ ์๋ต
default:
์ value ๊ฐ ๋ชจ๋ ์๋ ๊ฒฝ์ฐ
}
// ๊ฐ๋
์ฑ์ ์ํด ๊ฐ์ ์กฐ๊ฑด์ case์ ์์ ํจ๊ป ์
๋ ฅ๋ ๊ฐ๋ฅํ๋ค.
case "a", "A":
print("The letter A")
default:
print("Not the letter A")
}
switch ๋ฌธ case ์ ํ๋์ ๋ฐ๋์ ์ผ์นํด์ผํ๊ณ , ๊ทธ๊ฒ์ด ์๋ ๊ฒฝ์ฐ default๋ฌธ์ ํต๊ณผ์์ผ์ผํ๊ธฐ ๋๋ฌธ์, ๋ฌด์กฐ๊ฑด์ ์ผ๋ก default ๊ตฌ๋ฌธ์ ์ ๋ ฅํด์ฃผ์ด์ผ ํ๋ค.
No implicit fallthrough (์์์ ์ผ๋ก ๋น ์ ธ๋๊ฐ์ง ์์)
์ค์ํํธ์ switch๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๊ฐ์ case์ ์ ๋น ์ ธ๋๊ฐ ๋ค์์ผ๋ก ๋ค์ด๊ฐ์ง ์๋๋ค. ๊ทธ ๋์ , ๋ช ์์ ์ธ break ๋ฌธ ์์ด๋, ์ฒซ๋ฒ์งธ๋ก ์ผ์นํ switch case ์ ์ ์๋ฃํ์๋ง์ ๊ณง ์ ์ฒด switch ๋ฌธ์ ์ข ๋ฃํ๋ค.
Interval Matching (๊ตฌ๊ฐ ๋ง์ถค)
switch case ์ ์์ ๊ฐ์ด ์ผ์ ๊ตฌ๊ฐ์ ํฌํจ๋๋์ง๋ฅผ ๊ฒ์ฌํ ์ ์๋ค. ๋ค์ ์์ ๋ ์์น๊ตฌ๊ฐ์ ์ฌ์ฉํ์ฌ ์ด๋ค ํฌ๊ธฐ์ ์๋ ์์ฐ์ด๋ก ์ธ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์๋ ์ฝ๋์์๋ ๊ฐ๊ฐ์ case ์ ์ ํด๋น ๊ฐ์ ํ๋์ ์๋ ๊ตฌ๊ฐ๊ณผ ๋น๊ต ํ๋ค.
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
naturalCount = "no"
case 1..<5:
naturalCount = "a few"
case 5..<12:
naturalCount = "several"
case 12..<100:
naturalCount = "dozens of"
case 100..<1000:
naturalCount = "hundreds of"
default:
naturalCount = "many"
}
print("There are \\(naturalCount) \\(countedThings).")
Tuples (ํํ)
ํํ์ ์ฌ์ฉํ๋ฉด ๋์ผํ swtich ๋ฌธ์์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ํ ์คํธํ ์ ์๋ค. ๊ฐ๊ฐ์ ํํ ์์๋ฅผ ์๋ก ๋ค๋ฅธ ๊ฐ ๋๋ ๊ตฌ๊ฐ๊ณผ ํ ์คํธํ ์ ์๋ค. ๋์์ผ๋ก ๋ฐ์ค (_) ์ ์ฐ๋ฉด ๊ฐ๋ฅํ ์ด๋ค ๊ฐ๊ณผ๋ ์ผ์นํ๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ‘์์ผ๋ ์นด๋ ํจํด'์ด๋ผ๊ณ ํ๋ค.
์๋ ์์ ๋ (Int, Int) ๋ผ๋ ๋จ์ํ ํํ ํ์ ์ผ๋ก ํํํ (x, y) ์ ์ ์ทจํ์ฌ ์ถ๋ ฅํด๋ณด์๋ค.
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
print("\\(somePoint) is at the origin")
case (_, 0):
print("\\(somePoint) is on the x-axis")
case (0, _):
print("\\(somePoint) is on the y-axis")
case (-2...2, -2...2):
print("\\(somePoint) is inside the box")
default:
print("\\(somePoint) is outside of the box")
}
Value Bindings (๊ฐ ์ฐ๊ฒฐ)
switch case ์ ์ ์ผ์นํ๋ ๊ฐ ๋๋ ๊ฐ๋ค์ case ์ ๋ณธ๋ฌธ์์ ์ฌ์ฉํ ์์ ์์๋ ๋ณ์๋ก ์ด๋ฆ์ ์ง์ ์ ์๋ค. ์ด๋ฌํ ๋์์ ๊ฐ์ฐ๊ฒฐ(value binding) ์ด๋ผ๊ณ ํ๋๋ฐ ์ด๋ case ์ ๋ณธ๋ฌธ ์์ ์์ ์์๋ ๋ณ์์ ๊ฐ์ ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ์์ ๋ (Int, Int) ๋ผ๋ ํํํ์ ์ผ๋ก ํํํ (x,y) ์ ์ ์ทจํ์ฌ, ์ถ๋ ฅํด๋ณด์๋ค.
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
print("on the x-axis with an x value of \\(x)")
case (0, let y):
print("on the y-axis with a y value of \\(y)")
case let (x, y):
print("somewhere else at (\\(x), \\(y))")
}
Where ์
switch case ์ ์ where ์ ์ ์ฌ์ฉํ๋ฉด ์ถ๊ฐ ์กฐ๊ฑด์ ๊ฒ์ฌํ ์ ์๋ค. wher ์ ์กฐ๊ฑดํ๊ฐ๊ฐ true ์ผ ๊ฒฝ์ฐ์๋ง ์ถ๋ ฅํ๋ค.
์ต์ข case ์ ์ ๋จ์์๋ ๊ฐ๋ฅํ ๊ฐ๊ณผ ์ผ์นํ๋ฏ๋ก, switch๋ฌธ์ ์์ ํ ์์งํ๊ฒ ๋ง๋ ๋ default ์ ์ด ํ์๊ฐ ์๋ค.
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
print("(\\(x), \\(y)) is on the line x == y")
case let (x, y) where x == -y:
print("(\\(x), \\(y)) is on the line x == -y")
case let (x, y):
print("(\\(x), \\(y)) is just some arbitrary point")
}
Compound Cases (๋ณตํฉ case์ )
switch ๋ฌธ์์ ๋์ผํ ๋ณธ๋ฌธ์ ๊ณต์ ํ๋ ์ฌ๋ฌ ๊ฐ์ case ์ ์ ์ผํ๋ฅผ ๋์ด ์ฌ๋ฌ ํจํด์ ์์ฑํ์ฌ ์กฐํฉํ ์ ์๋ค.
let someCharacter: Character = "e"
switch someCharacter {
case "a", "e", "i", "o", "u":
print("\\(someCharacter) is a vowel")
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
print("\\(someCharacter) is a consonant")
default:
print("\\(someCharacter) is not a vowel or a consonant")
}
๋ณตํฉ case ์ ์ value binding ๊ฐ์ฐ๊ฒฐ ์ ํฌํจํ ์๋ ์๋ค. ๋ณตํฉ case ์ ์ ๋ชจ๋ ํจํด์ ๋์ผํ ๊ฐ์ฐ๊ฒฐ ์งํฉ์ ํฌํจํด์ผํ๋ฉฐ, ๊ฐ๊ฐ์ ์ฐ๊ฒฐ์ ๋ชจ๋ ๋ณตํฉ case์ ํจํด์์ ๋๊ฐ์ ํ์ ์ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค. ์ด๋, ๋ณตํฉ case ์ ์ ์ด๋ ๋ถ๋ถ์ด ์ผ์นํ๋ ๊ฐ์, case ์ ๋ณธ๋ฌธ ์ฝ๋๊ฐ ์ฐ๊ฒฐ ๊ฐ์ ํญ์ ์ ๊ทผํ ์ ์๊ณ ๊ฐ์ ํ์ ์ด ํญ์ ๋๊ฐ๋๋ก, ๋ณด์ฅํ๋ค.
let stillAnotherPoint = (9, 0)
switch stillAnotherPoint {
case (let distance, 0), (0, let distance):
print("On an axis, \\(distance) from the origin")
default:
print("Not on an axis")
}
Control Transfer Statements (์ ์ด ์ ๋ฌ๋ฌธ)
์ ์ด์ ๋ฌ๋ฌธ์ ์ ์ด๋ฅผ ์ฝ๋ ํ ๊ณณ์์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ ๋ฌํ์ฌ, ์ฝ๋ ์คํ ์์๋ฅผ ๋ฐ๊พผ๋ค. ์ค์ํํธ์์๋ ์๋ ๋ค์ฏ๊ฐ์ ์ ์ด์ ๋ฌ๋ฌธ์ ์ ๊ณตํ๋ค.
- continue
- break
- fallthrough
- return // ch6 [Funcions]์์ ์์ธํ๊ฒ ๋ค๋ฃธ
- throw // ch17 [Error์ฒ๋ฆฌ]์์ ์์ธํ๊ฒ ๋ค๋ฃธ
Continue ๋ฌธ
์ง๊ธํ๊ณ ์๋ ์คํ์ ๋ฉ์ถ๊ณ , ๋ฐ๋ณต๋ฌธ์ ํต๊ณผํ์ฌ ๋ค์ ํ์ฐจ ๋งจ ์์์ ๋ค์ ์์ํ๋ผ. ๊ณ ์ ๋ฌํด์ค๋ค. ์ด๋ ๋ฐ๋ณต๋ฌธ์ ์์ ํ ๋ ๋์ง ์๊ณ ๋ ํ์ฌ ํ์ฐจ์์ ํ ๊ฑด ๋คํ๋ค๊ณ ์ ๋ฌํ๋ ๊ฒ์ด๋ค.
์๋ ์ฝ๋์ฒ๋ผ ๊ตฌํํ ๊ฒฝ์ฐ, if ๋ฌธ์ ํต๊ณผํ๊ฒ ๋ ๊ฒฝ์ฐ ๊ทธ ์ดํ์ append ๋ฅผ ์คํํ์ง ์๊ณ ๋ค์ผ character ๋ก ๋์ด๊ฐ๊ฒ๋๋ค.
let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput {
if charactersToRemove.contains(character) {
continue
}
puzzleOutput.append(character)
}
print(puzzleOutput)
break ๋ฌธ
break๋ฌธ์ ๊ณง๋ฐ๋ก ์ ์ฒด ์ ์ด ํ๋ฆ๋ฌธ ์คํ์ ๋๋ด๋ฒ๋ฆฐ๋ค. switch ๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ ์คํ์ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ณด๋ค ๋ ์ผ์ฐ ์ข ๊ฒฐํ๊ณ ์ถ์๋ switch๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ ์์ break๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
Break in a Loop Statement (๋ฐ๋ณต๋ฌธ ์์ break ๋ฌธ)
๋ฐ๋ณต๋ฌธ ์์์ ์ฌ์ฉํ ๋, break ๊ฐ ๋ฐ๋ณต๋ฌธ ์คํ์ ๊ณง๋ฐ๋ก ๋๋ด๊ณ ์ ์ด๋ฅผ ๋ฐ๋ณต๋ฌธ ๋ซ๋ ์ค๊ดํธ (}) ๋ค์ ์ฝ๋๋ก ์ฎ๊ธด๋ค. ๋ ์ด์ ๋ฐ๋ณต๋ฌธ์ ํ์ฌ ํ์ฐจ ์ฝ๋๋ฅผ ์คํํ์ง๋, ๋ฐ๋ณต๋ฌธ ํ์ฐจ๋ฅผ ์์ํ์ง๋ ์๋๋ค.
Break in a switch statement (switch ์์ break ๋ฌธ)
switch ๋ฌธ ์์์ ์ฌ์ฉํ ๋, break ๊ฐ switch ๋ฌธ ์คํ์ ๊ณง๋ฐ๋ก ๋๋ด๊ณ ์ ์ด๋ฅผ switch ๋ฌธ ๋ซ๋ ์ค๊ดํธ (}) ๋ค์ ์ฝ๋๋ก ์ฎ๊ธฐ๋๋ก ํ๋ค.
์ด๋ฐ ๋์์ ์ฌ์ฉํ๋ฉด switch๋ฌธ์ ์๋ ํ๋ ์ด์์ case ์ ์ ์ผ์น์์ผ์ ๋ฌด์ํ ์ ์๋ค. ์ค์ํํธ์ switch ๋ฌธ์ ์์ ํ ์์งํด์ผ ํ๋ฉฐ ๋น case ์ ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์, ์๋๋ฅผ ๋ช ์ํ๊ธฐ ์ํด์ ์ผ๋ถ๋ฌ case ์ ์ ์ผ์น์ํค๊ณ ๋ฌด์ํ๋ ๊ฒ ํ์ํ ๋๊ฐ ์๋ค. ์ด๋ฅผ ํ๋ ค๋ฉด ๋ฌด์ํ๋ ค๋ case ์ ์ ์ฒด ๋ณธ๋ฌธ์ break ๋ฌธ์ผ๋ก ์์ฑํ๋ฉด ๋๋ค. switch ๋ฌธ์ด ํด๋น case ์ ๊ณผ ์ผ์นํ ๋, case ์ ์์ break ๋ฌธ์ด switch ๋ฌธ ์คํ์ ๊ณง๋ฐ๋ก ๋๋ธ๋ค.
Fallthrough ๋ฌธ
์ค์ํํธ์ switch๋ฌธ์ ๊ฐ๊ฐ์ case ์ ๋ฐ์ ๋น ์ ธ๋๊ฐ ๋ค์์ผ๋ก ๋ค์ด๊ฐ์ง ์๋๋ค. ํ์ง๋ง fallthrough๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ case ๋ฌธ์ ๊ฑฐ์น ๋ค, ๊ทธ ๋ค์ case ๋ฌธ์ ๋ด์ฉ์ ์ด์ด์ ์คํํ๋ ๋์์ด ๊ฐ๋ฅํ๋ค. ํ๋ก๊ทธ๋จ์ ๋น๋ก ๊ทธ ๋ค์ switch case๊ฐ ํ์ฌ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ์๋๋ค๊ณ ํ๋๋ผ๋ fallthrough๋ฌธ์ด ์๋ค๋ฉด ์ด์ด์ ์คํํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
let integerToDescribe = 5
var description = "The number \\(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}
print(description)
// "The number 5 is a prime number, and also an integer." ๋ฅผ ์ธ์ํจ
Labeled statements (์ด๋ฆํ ๊ตฌ๋ฌธ)
์ค์ํํธ์์ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค ๋ณด๋ฉด, break๋ฌธ์ด ์ด๋ ๋ฐ๋ณต๋ฌธ ๋๋ ์กฐ๊ฑด๋ฌธ์ ์ข ๋ฃํ ์ง ๋ช ํํ๊ฒ ๋ช ์ํ๋ ๊ฒ์ด ํ์ํ ๋๊ฐ ์๋ค. ๋ continue ๋ฌธ์ด ์ด๋ ๋ฐ๋ณต๋ฌธ์ ์ํฅ์ ์ค์ง ๋ช ์ํด์ผํ ๋๋ ์๋ค.
์ด๋ด ๋ ์ด๋ฆํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ ์ฉํ๋ค.
(label name) : while (์กฐ๊ฑด) {
statements ๊ตฌ๋ฌธ
}
์์ ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์์ฝ๋๋ฅผ ์ฌ์ฉํด์ ์์ ๋ฅผ ์์ฑํด๋ณด์.
gameLoop: while square != finalSquare {
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
// diceRoll ์ด ์ต์ข
์ ์ฌ๊ฐํ์ผ๋ก ์ด๋์ํฌ ๊ฒ์ด๋ฏ๋ก, ๊ฒ์์ด ๋๋จ
break gameLoop
case let newSquare where newSquare > finalSquare:
// diceRoll ์ด ์ต์ข
์ ์ฌ๊ฐํ ๋๋จธ๋ก ์ด๋์ํฌ ๊ฒ์ด๋ฏ๋ก, ๋ค์ ๊ตด๋ฆผ
continue gameLoop
default:
// ์ด๋ ์ ํจํ ์ด๋์ด๋ฏ๋ก, ์์ ์ ํจ๊ณผ๋ฅผ ์ฐพ์๋
square += diceRoll
square += board[square]
}
}
print("Game over!")
Early Exit (์ด๋ฅธ ํ์ถ๋ฌธ)
guard ๋ฌธ์, if๋ฌธ๊ณผ ๊ฐ์ด ํํ์์ ๋ถ๋ฆฌ์ธ ๊ฐ์ ์์กดํ์ฌ ๊ตฌ๋ฌธ์ ์คํํ๋ค. guard๋ฌธ์ guard๋ฌธ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด์ ์กฐ๊ฑด์ด ๋ฐ๋์ ์ฐธ์ด๊ธธ ์๊ตฌํ๊ณ ์ ์ฌ์ฉํ๋ค. if ๋ฌธ๊ณผ ๋ฌ๋ฆฌ, guard๋ฌธ์๋ ํญ์ else ์ ์ด ์๋ค. ์กฐ๊ฑด์ด ์ฐธ์ด ์๋๋ฉด else ์ ์์ ์ฝ๋๋ฅผ ์คํํ๋ค.
์๋ ์ฝ๋์์ guard๋ฌธ ์กฐ๊ฑด์ ๋ถํฉํ๋ฉด, guard๋ฌธ ๋ซ๋ ์ค๊ดํธ ๋ค์ ์ฝ๋๋ฅผ ๊ณ์ ์คํํ๋ค. ์กฐ๊ฑด์ ์์ ์ต์ ๋ ์ฐ๊ฒฐ๋ก ๊ฐ์ ํ ๋นํ ์ด๋ค ๋ณ์ ๋๋ ์์๋ guard ๋ฌธ์ด ์๋ ์ฝ๋ ๋ธ๋ญ ๋๋จธ์ง์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํด๋น ์กฐ๊ฑด์ ๋ถํฉํ์ง ์์ผ๋ฉด else ๋ถ๊ธฐ ์์ ์ฝ๋๋ฅผ ์คํํ๋ค. ํด๋น ๋ถ๊ธฐ๋ guard ๋ฌธ์ด ์๋ ์ฝ๋ ๋ธ๋ญ์ ํ์ถ ํ๊ธฐ ์ํด ๋ฐ๋์ ์ ์ด๋ฅผ ์ฎ๊ฒจ์ผ ํ๋ค. ์ด๋ return, break, continue, throw์ ๊ฐ์ ์ ์ด ์ ๋ฌ๋ฌธ์ผ๋ก ํ ์๋, ์๋๋ฉด fetalError ๊ฐ์ ๋ฐํ ์ํ๋ ํจ์๋ ๋ฉ์๋ ํธ์ถ๋ก ํ ์ ์๋ค.
ํ์ ์กฐ๊ฑด์ผ๋ก guard ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฑด, ๋์ผํ ๊ฒ์ฌ๋ฅผ if ๋ฌธ์ผ๋ก ํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ, ์ฝ๋ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๋ค. ์ด๋ ์คํ ์ฝ๋๋ฅผ else ๋ธ๋ญ์ผ๋ก ํฌ์ฅํ์ง ์๊ณ ๋ ์์ฑํ๊ฒ ํด์ฃผ๋ฉฐ, ์๋ฐ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ํ์ ์กฐ๊ฑด๊ณผ ๋๋ํ ์ ์งํ๋๋ก ํด์ค๋ค.
func greet(person: [String: String]) {
guard let name = person["name"] else {
return
}
print("Hello \\(name)!")
guard let location = person["location"] else {
print("I hope the weather is nice near you.")
return
}
print("I hope the weather is nice in \\(location).")
}
greet(person: ["name": "John"])
// "Hello John!" ์ ์ธ์ํจ
// "I hope the weather is nice near you." ๋ฅผ ์ธ์ํจ
greet(person: ["name": "Jane", "location": "Cupertino"])
// "Hello Jane!" ์ ์ธ์ํจ
// "I hope the weather is nice in Cupertino." ๋ฅผ ์ธ์ํจ
+) ๊ฐ๋ตํ ์ถ๊ฐ์ค๋ช
guard๋ฌธ์ ์กฐ๊ฑด์ด ํ๋ฆฐ ๊ฒฝ์ฐ๋ ๋ชจ๋ ๋ฒ๋ฆฌ๊ณ , ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์กฐ๊ฑด๋ง ํต๊ณผ์ํค๊ฒ ๋ค๋ ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉ๋๋ค. if๋ฌธ๊ณผ์ ์ฐจ์ด์ ์ผ๋ก ๋ณด๋ฉด if๋ฌธ์ '~๋ฉด ~ํด๋ผ' ์ ์คํ ๊ตฌ๋ฌธ์ด์ง๋ง, guard๋ '~์๋๋ฉด ๋๋ด๋ผ' ๋ผ๋ ์๋ฏธ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ guard๋ฌธ์ '๋น ๋ฅธ ์ข ๋ฃ'์ ํต์ฌ์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋๊น, ์กฐ๊ฑด์ด ๋ง์ง ์์ผ๋ฉด ์ข ๋ฃ์ํค๋๋ก ํ๋ ๋ฌธ๋ฒ์ด ๋ฐ๋์ ํฌํจ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์, early exit ๋ผ๋ ํค์๋์ ์ ๋ชฉ์ผ๋ก ์์ ์์๊ฐ ๋์จ ๊ฒ์ด๋ค. (guard๋ฌธ์ return ์ด๋ throw๋ฅผ ํตํด ๋น ๋ฅธ ์ข ๋ฃ๋ฅผ ๊ผญ!! ํด์ฃผ์ด์ผ ํ๋ค.)
Checking API Availability (API ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ๊ฒ์ฌ)
์ค์ํํธ๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ API ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๊ณ ๊ฐ ์๋๋ก API ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ๊ฒ์ฌ๋ฅผ ๋ด์ฅ์ง์ ํ๋ค.
์ปดํ์ผ๋ฌ๋ ์ฝ๋์์ ์ฌ์ฉํ ๋ชจ๋ API ๊ฐ ํ๋ก์ ํธ์์ ์ง์ ํ ๋ฐฐํฌ ๋์์์ ์ฌ์ฉ๊ฐ๋ฅํ ์ง ๊ฒ์ฆํ๊ธฐ ์ํด SDK์ ์๋ ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ค. ์ฌ์ฉ๋ถ๊ฐ๋ฅํ API๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ณด๊ณ ํ๋ค.
์คํ ์๊ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ง์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ค๋ API, ์ฝ๋ ๋ธ๋ญ์ ์กฐ๊ฑด๋ถ๋ก ์คํํ๋ ค๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ์กฐ๊ฑด์ if ๋ฌธ์ด๋ guard ๋ฌธ ์์ ์ฌ์ฉํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ ํด๋น ์ฝ๋ ๋ธ๋ญ API ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์ง ๊ฒ์ฆํ ๋ ์ฌ์ฉ ๊ฐ๋ฅ์ฑ ์กฐ๊ฑด์ ์๋ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ค.
if #available(iOS 10, macOS 10.12, *) {
// iOS ์์๋ iOS 10 API ๋ฅผ ์ฌ์ฉํ๊ณ , macOS ์์๋ macOS 10.12 API ๋ฅผ ์ฌ์ฉํจ
} else {
// ๋ฌผ๋ฌ๋์ ๋ ์ด์ iOS ์ macOS API ๋ฅผ ์ฌ์ฉํจ
}