스위프트는 다양한 종류의 제어문을 제공한다. while
문을 통해 여러 번 작업을 실행할 수 있고, if, guard, switch
문은 특정 조건에 따라 다양한 분기점의 코드를 실행할 수 있다. break, continue
문은 코드 내 다른 지점으로 실행 흐름을 변경할 수 있다.
또한 for-in
반복문을 통해 배열, 딕셔너리, 문자열 등 반복적으로 접근 가능한(iterable) 데이터에 하나씩 접근할 수 있다.
switch
문은 튜플, 캐스팅, 인터벌 매칭 등 C언어 등에서 지원하는 것보다 기능이 강력하다.
for-in
반복문을 통해 배열, 숫자 범위, 문자열 내 캐릭터 등 시퀸스로 표현된 데이터를 하나씩 접근할 수 있다.
let example_for_in = ["This", "is", "Swift"]
for example in example_for_in {
print("\(example)")
}
// This
// is
// Swift
// for-in loop in array
딕셔너리에 for-in
반복문을 사용할 때에는 키-값 쌍을 통해 접근할 수 있다. 딕셔너리 아이템은 (key, value)
튜플로 리턴되기 때문이다. 정렬된 상태로 접근할 때에는 sorted
메소드를 사용하자.
let dictionary_for_in = [1:"One", 2:"Two", 3:"Three", 4:"Four"]
for (num_int, num_str) in dictionary_for_in {
print("\(num_int) is \(num_str)")
}
// 1 is One
// 2 is Two
// 3 is Three
// 4 is Four
// for-in loop in dictionary
수 범위에 접근할 수도 있다.
for idx in 1...9{
print("2 * \(idx) = \(2*idx)")
}
// 2 * 1 = 2
// ...
// 2 * 9 = 18
// for-in loop in numeric ranges
range
를 사용할 때 변수를 넣을 수도 있다. range
에 들어 있는 값을 사용하지 않고 횟수만 중요하다면 언더스코어 _
를 사용하자.
let base = 2
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
// answer = 1*2*2*2...*2 = 2^10
// for-in loop in numeric ranges: underscore _ and variables
...
폐쇄문이 두 범위를 모두 포함하는 코드라면 ..<
와 같은 코드를 통해 마지막 범위는 접근하지 않을 수 있다. 특히 인덱스에 접근할 때 유용하다.
let minitues = 60
for check in 0..<minutes{
// check at 0, 1, ..., 59
}
// for-in loop in numeric ranges: half open range
stride
함수를 통해 시작점과 끝점까지 반복하되, +1
이 아니라 보폭을 변경할 수 있다.
let minitues = 60
let interval = 10
for check in stride(from: 0, to:minitues, by:interval){
// check at 0, 10, 20, 30, 40, 50
}
// for-in loop using stride
for-in
루프문은 시퀸스 형태의 모든 데이터 타입에 반복적으로(iterable) 접근 가능한 매우 유용한 방식이기 때문에,stride
방법까지 잘 익히자.
while
반복문은 주어진 조건이 false
가 될 때까지 코드를 반복한다. 조건이 반복될 때까지 주어진 횟수를 사전에 알지 못할 때 주로 사용한다.
while
은 루프를 시작할 때마다, repeat-while
은 루프를 끝날 때 조건을 검사한다.
while
문은 조건이 참인지 거짓인지 확인한 뒤 이후 코드를 실행한다. true
라면 일련의 코드가 반복되지만, false
라면 실행되지 않는다. 즉 while condition { statements}
.
반복문을 실행하는 총 횟수가 사전에 정해지지 않은 유형일 때 while
이 적절하다는 것을 기억하자.
while
과 달리 일단 블록 안의 코드를 한 번 실행한 뒤 조건을 검사해 반복 여부를 확인한다. C언어의 do-while
과 유사하다고 보면 될 것 같다.
repeat {statements} while condition
구조이기 때문에 while
과 달리 처음 한 번은 필수적으로 실행해야 하는 상황에서 이 문법을 사용하자.
특정 조건에 따라 수행할 코드 블록이 다르다면 조건문 if
나 switch
등을 사용하자. 조건이 간단하다면 전자를, 다소 고를 선택지가 많다면 후자를 통해 제어할 수 있다. 특히 패턴 매칭 등 코드 분기가 일어나는 순간을 고를 때 switch
문이 적절하다.
if
조건이 true
라면 블록 안의 코드를 실행한다.
var temperature = 20
if temperature <= 5 {
print("It's cold outside")
}
else
를 통해 if
가 false
일 때 경우 역시 제어할 수 있다.
var temperature = 20
if temperature <= 5 {
print("It's cold outside")
} else {
print("It's OK")
}
두 개 이상의 if
를 통해 다양한 조건을 사용하자.
var temperature = 20
if temperature <= 5 {
print("It's cold outside")
} else if temperature <= 25{
print("It's good")
} else {
print("getting hotter")
}
주어진 변수/상수에 해당하는 값마다 실행할 블록을 따로 설정할 수 있다. if
보다 더 많은 블록을 사용할 때 적절하다.
let alphabet: Character = "b"
switch alphabet {
case "a":
print("first letter")
case "b":
print("second letter")
case "c":
print("third letter")
default:
print("others")
}
C언어에서와 달리 switch
문에서 break
문을 사용하지 않아도 된다. case
와 매칭되는 첫 번째 블록이 실행된다면 곧바로 이후 case
를 살펴보지 않고 곧바로 종료되기 때문이다. 또한 case
내 블록에서 실행할 블록이 있어야 한다.
여러 개의 조건에서 공통된 블록을 실행하고 싶다면 case
에 연달아 조건을 작성하자.
let alphabet: Character = "b"
switch alphabet {
case "a", "A":
print("first letter")
case "b", "B":
print("second letter")
case "c", "C":
print("third letter")
default:
print("others")
}
case
에서 interval
을 사용해 조건에 들어가는 수를 확인할 수 있다.
let cnt = 80
let msg: String
switch cnt {
case 0:
msg = "no"
case 1..<40:
msg = "little"
case 40..<100:
msg = "some"
default:
msg = "many"
}
print("There are \(msg) things.")