스위프트의 흐름 제어 구문에서는 소괄호 '()' 를 대부분 생략할 수 있다. 그러나, 중괄호 '{}' 는 생략할 수 없다.
본 글에서는 스위프트에서의 조건문과 반복문의 기본적인 문법 중 놓치기 쉬운 부분을 한 번 정리해 본 글이다.
조건문
if
정수, 실수 등 0이 아닌 모든 값을 참으로 취급하여 조건 값이 될 수 있었던 다른 언어와는 달리 스위프트의 if구문은 조건의 값이 꼭 Bool 타입이어야 한다.
코드 예시
let first: Int = 5
let second: Int = 5
var biggerValue: Int = 0
// 조건 수식을 소괄호로 묶어주는 것은 선택사항.
if (first > second) {
biggerValue = first
} else if (first == second) {
biggerValue = first
} else if (first < second) {
biggerValue = second
} else if (first == 5) {
// first == 5 라는 조건을 충족하나, 이미 위 조건 first == second 를 충족했기에 그 곳에서 실행하고 if 문은 종료. 따라서 실행 되지 않는다.
biggerValue = 100
}
// 마지막 else 는 생략 가능. 즉 if 단독으로도 사용 가능
print(biggerValue) // 5
switch
switch 구문에 소괄호 생략 가능
break 키워드도 선택 사항. 즉, 스위프트에서는 case 문이 끝나면 break 쓰지 않아도 자동으로 switch 문을 종료 한다.
switch 에 정수 타입만 들어갈 수 있었던 C언어와 달리, 스위프트에서는 switch구문의 조건에 다양한 값이 들어갈 수 있다. 다만,
각 case에 들어갈 비교 값은 입력 값과 데이터 타입이 같아야 한다.
또한 비교될 값이 명확히 한정적인 값(열거형 등)이 아닐 때는 default 를 사용해야 한다.
각 case 에는 범위 연산자, where 절을 사용할 수도 있다.
아래 기본 형태를 보자.
switch 입력 값 {
case 비교 값 1:
실행 구문
case 비교 값 2:
실행 구문
// fallthrough 를 사용하여, case 연속 실행
fallthrough
case 비교 값3, 비교 값4, 비교 값5: // 한 번에 여러 값 비교 가능
실행 구문
break
default: // 한정된 범위가 명확치 않다면 default 필수
실행 구문
}
fallthrough를 사용하면 현재 case의 실행이 끝난 후, 다음 case 또는 default 블록으로 넘어가지 않고 바로 다음 case의 코드를 실행하게 한다. 이는 다른 언어의 switch 구문처럼 case를 통과하는 행위를 모방하고자 할 때 유용하다.
let someCharacter: Character = "z"
switch someCharacter {
case "a":
print("The first letter of the alphabet")
case "z":
print("The last letter of the alphabet")
fallthrough
default:
print("Some other character")
}
/*
이 예시에서는 someCharacter가 "z"일 때, 첫 번째 case는 일치하지 않고, 두 번째 case에서 일치한다.
fallthrough가 사용됨으로써 "The last letter of the alphabet"을 출력한 후,
default 블록으로 넘어가 "Some other character"도 출력한다.
이때 만약 fallthrough가 없다면,
"The last letter of the alphabet"만 출력되고 switch 구문이 종료된다.
*/
와일드카드 식별자를 사용한 튜플 switch case 구성
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("yungui", 99)
switch tupleValue {
case ("yungui", 50):
print("정확히 맞췄습니다")
case ("yungui", _):
print("이름만 맞았습니다. 나이는 \(tupleValue.age)입니다.")
case (_, 99):
print("나이만 맞았습니다. 이름은 \(tupleValue.name)입니다.")
default:
print("누굴 찾나요?")
}
와일드 카드 식별자를 사용하면, 무시된 값을 직접 가져와야 하는 불편함이 생긴다. 이를 해소하기 위해, let 값 바인딩을 사용할 수 있다.
값 바인딩을 사용한 튜플 switch case 구성
switch tupleValue {
case ("yungui", 50):
print("정확히 맞췄습니다")
case ("yungui", let age):
print("이름만 맞았습니다. 나이는 \(age)입니다.")
case (let name, 99):
print("나이만 맞았습니다. 이름은 \(name)입니다.")
default:
print("누굴 찾나요?")
}