카테고리 없음

Swift - Control Flow

jin_j_i_n 2022. 1. 10. 23:51

1. Control Flow

Swift는 다양한 제어 흐름 명령문을 제공한다.

While - 작업을 여러번 수행하는 루프 / if, guard, switch 등 특정 조건에 따라 코드의 다른 분기를 실행할 수 있고 break, continue등으로 다른지점에서 실행의 흐름을 전송할 수 있는 명령문 등을 제공한다.

또한 for - in 루프와 같이 특정 시퀀스를 단순하게 반복할 수 있는 방법도 제공한다.

 

Swift의 다양한 흐름제어문은 튜플, 타입캐스팅, 간격일치(?)등과 같은 다양한 패턴들과 함께 매치될 수 있다. 

switch문 같은경우 case 본문 내 값을 상수, 변수에 바인딩할 수 있으며 where절로 복잡한 조건에 대해 표현할 수 있다.

 

2.  For - In Loops

2.1 기본 문법 

특정 시퀀스 (배열, 수의 범위, 문자열의 문자들과 같은)를 반복하기 위해 for - in loop를 사용할 수 있다.

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

2.2 딕셔너리 반복

사전과 같은 시퀀스를 반복하여 key - value 에 액세스할 수 있다. 딕셔너리의 각 항목은 튜플로 반환되어 루프문 내에서 사용하기 위한 상수로 튜플의 멤버를 분해할 수 있다.

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}
// cats have 4 legs
// ants have 6 legs
// spiders have 8 legs

이때 Dictionary는 순서가 보장되는 Collection이 아니기 때문에 순서대로 반복되지 않을 수 있다.

 

2.3 범위 반복 (개구간, 반개구간)

또한 수 범위와 함께 루프문을 작성할 수 있다.

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

여기서 index는 루프의 각 반복이 시작될 때 자동으로 설정되는 상수이다.

따라서 index는 따로 선언할 필요가 없고, let 키워드 없이 루프문 선언에 포함함으로써 암시적으로 선언된다.

 

1...5 범위는 개구간으로, 1과 5를 포함한 그 사이의 정수를 반복한다. 

반면 0..<60 과 같은 반개구간도 루프문에서 사용할 수 있다.

let minutes = 60
for tickMark in 0..<minutes {
    // render the tick mark each minute (60 times)
}

 

2.4 원하는 주기로 시퀀스 반복

stride(from:to:by:) 를 사용하여 원하는 주기만큼 시퀀스를 반복시킬 수 있다. (반개구간)

let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
}

개구간 범위를 나타낼 떈 stride(from:through:by:) 를 사용할 수 있다.

let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // render the tick mark every 3 hours (3, 6, 9, 12)
}

 

2.5 _ 를 사용하여 값 접근 생략

루프문을 실행할때 시퀀스의 각 값이 필요하지 않은경우 변수이름 대신 를 사용하여 생략할 수 있다.

let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// Prints "3 to the power of 10 is 59049"

루프 변수 대신 _ 를 사용하면 루프문이 돌아가는동안 각각의 값에 대해 접근하지 않고 무시할 수 있다.

 

위 예시에선 range, 배열, 딕셔너리 등을 사용했지만, Sequence 프로토콜을 준수하는 타입이라면 for - in 루프문을 사용하여 반복할 수 있다.

3.  While Loops

for - in 루프문은 시퀀스 길이가 정해진 반면, 반복해야하는 어떤 행위에 대해 길이를 알지 못하는 경우 쓰기 적합한 반복문이다.

단일 조건을 검사하는것으로 시작하고, 조건이 참이면 조건이 거짓이 될 때 까지 일련의 명령문이 반복된다.

while문 구성

4.  repeat - while

while문의 또다른 형태로, 보통의 while문과는 다르게 while문 조건을 검사하는것으로 시작하지 않고, 일단 최초에 먼저 코드블럭 안의 명령문을 실행한 후 while 조건이 거짓일 때까지 루프를 계속 반복한다. (다른 언어의 do - while문과 유사하다)