Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift Documents

[Swift] ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ (5) - Control Flow (์ œ์–ด ํ๋ฆ„) (for, while, repeat-while, if, switch case, break, continue, fallthrough)

๊ฐ์ž ๐Ÿฅ” 2022. 2. 11. 15:24
๋ฐ˜์‘ํ˜•

 

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

๊ทผ๋ฐ ๋งˆ์นจ!! ์Šค์œ„ํ”„ํŠธ ๊ฐœ๋ฐœ์ž๋“ค๋งŒ ๋ชจ์—ฌ์žˆ๋Š” ์˜คํ”ˆ์ฑ„ํŒ…๋ฐฉ์ด ์žˆ๋Š๋ฐ, ๊ทธ ํ†ก๋ฐฉ์—์„œ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ํ•˜๋ฃจ์— ํ•œ ์ฑ•ํ„ฐ์”ฉ ๋ชจ์—ฌ์„œ ์Šคํ„ฐ๋””ํ•˜์ž๋Š” ์Šคํ„ฐ๋”” ๋ชจ์ง‘๊ธ€์ด ์˜ฌ๋ผ์™”๊ณ  ์–ผ๋ฅธ ์ง€์›ํ•ด์„œ ์Šคํ„ฐ๋””์— ์ฐธ์—ฌํ•˜๊ฒŒ๋˜์—ˆ์–ด์š”~! ํ˜ธํ˜ธํ™‹

์š”์ฆ˜ ๊ทธ๋ž˜์„œ ์Šคํ„ฐ๋””๋„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ณต์‹๋ฌธ์„œ๋„ ์ •๋…ํ•˜๊ณ , ๊ฐœ๋ฐœ๋„ ํ•˜๊ณ , ์•„์ฃผ ๊ฐ“์ƒ์„ ์‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์Šคํ„ฐ๋””ํ•˜๋ฉด์„œ ์ œ๊ฐ€ ์ •๋ฆฌํ•œ ๊ธ€์„ ๋ณด์‹œ์ฃ !

 

Swift Document chapter.05 Control Flow

 

 

Control Flow — The Swift Programming Language (Swift 5.6)

Control Flow Swift provides a variety of control flow statements. These include while loops to perform a task multiple times; if, guard, and switch statements to execute different branches of code based on certain conditions; and statements such as break a

docs.swift.org

 

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 ๋ฅผ ์‚ฌ์šฉํ•จ
}
๋ฐ˜์‘ํ˜•