Swift의 제어 흐름

2 분 소요

애플리케이션 개발 = 로직을 적용하는 작업
어떤 코드를 실행할지, 몇 번을 수행할지에 대한 결정으로 프로그램이 실행될 때 어떤 코드를 지나갈지 결정
-> 실행되는 프로그램의 흐름을 통제하는 것: 제어 흐름(control flow)

  • 반복 제어(looping control)
    코드를 몇 번 실행할지
  • 조건부 제어 흐름(conditional flow control)
    어떤 코드를 실행할지

반복 제어 흐름

지정된 조건에 만족할 때까지 반복적으로 수행하는 구문

for-in 구문

어떤 컬렉션이나 숫자 범위에 포함된 일련의 항목들을 반복하는 데 사용


for 상수명 in 컬렉션 또는 범위 {
    // 실행될 코드
}

상수명(constant name): 상수로 사용되는 이름, 반복문이 실행되는 컬렉션 또는 범위의 현재 항목(또는 값)을 담음, 참조체로 사용
컬렉션(collection) 또는 범위(range): 반복문을 통해 참조 (문자열들의 배열, 범위 연산자, 문자열 자체)

for index in 1...5 {
    print("Value of index is \(index)") //1~5
}

참조체가 for 반복문 안에서 필요하지 않다면 밑줄 문자로 대체(반드시 필요하지x)

var count = 0

for _ in 1...5 {
    // 현재 값에 대한 참조체가 필요없다.
    count += 1
}

while 반복문

지정된 조건에 만족할 때까지 일련의 작업을 반복


while 조건문 { // 조건문이 true인 동안 실행
    // 실행될 스위프트 구문
}

var myCount = 0

while myCount < 100 {
    myCount += 1
}

repeat … while 반복문

반복문 안의 코드가 언제나 적어도 한 번은 실행되야 하는 상황을 위해 사용(do .. while 반복문)


repeat {
    // 실행될 스위프트 구문
} while 조건식

var i = 10
repeat {
    i -= 1
} while (i > 0)

break 구문

현재 반복문에서 빠져나와 반복문 다음의 코드로 이동하여 실행을 계속하게 함

var j = 10

for _ in 0 ..< 100 {
    j += j
     
    if j > 100 {
        break
    }
     
    print("j = \(j)")
}

continue 구문

반복문의 나머지 코드를 건너뛰고 반복문의 처음으로 다시 돌아가게 함

var i = 1

while i < 20 {
    i += 1
    if (i % 2) != 0 { //짝수가 아니라면
        continue
    }
    print("i = \(i)")
}

조건부 흐름 제어

흐름 제어(flow control): 코드가 실행될 때 어떤 코드가 실행되고 어떤 코드를 건너뛰어야 하는지를 정의

if 구문 사용하기

조건식(Boolean expression)이 true로 판단되면 구문 내의 코드가 실행
조건식이 false로 판단되면 구문 내의 코드는 건너뜀
실행될 코드가 한 줄이라고 해도 스위프트에서는 괄호({})가 필수적!


if 조건식 {
    // 조건식이 true일 때 수행될 스위프트 코드
}

let x = 10

if x > 9 {
    print("x is greater than 9!")
}

if…else… 구문 사용하기

if구문의 조건식이 false로 판단될 때 수행할 코드를 지정


if 조건식 {
    // 조건식이 true일 때 수행될 스위프트 코드
} else {
    // 조건식이 false일 때 수행될 스위프트 코드
}

if x > 9 {
    print("x is greater than 9!")
} else {
    print("x is less than 9!")
}

if…else if… 구문 사용하기

다양한 조건을 바탕으로 결정 <-> switch 구문

let x = 9

if x == 10 {
    print("x is 10")
} else if x == 9 {
    print("x is 9")
} else if x == 8 {
    print("x is 8")
}

guard 구문

특정 조건을 만족하지 않은 경우에 현재의 함수 또는 반복문에서 빠져나올 수 있게 해줌


guard <조건문(불리언 표현식)> else {
    // 조건문이 false일 때 실행될 코드
     < 종료 구문 >
}
 
// 조건문이 true일 때 실행될 코드

불리언 표현식이 true일 때만 guard 구문 다음에 위치한 코드가 실행
불리언 표현식이 false일 때 수행될 else 절을 반드시 포함!
else절의 코드는 현재의 코드 흐름에서 빠져나가는 구문(return, break, continue, throw)을 반드시 포함!
or 자기 자신을 반환하지 않는 다른 함수나 메서드를 호출

func multiplyByTen(value: Int?) {
     
    guard let number = value, number < 10 else { // 옵셔널 바인딩
        print("Number is too hight") // 에러 메시지
        return // 종료 구문
    }
     
    let result = number * 10
    print(result)
}

언래핑된 number 변수는 guard 구문 밖의 코드에서도 유효
반면 if 구문 내에서 언래핑된 변수는 if 구문 밖에서는 유효하지 않다!