Swift에서의 조건문은 다른 언어들의 문법과 별반 다르지 않다. if 뒤에 조건을 걸어주고 중괄호 안에 해당 조건을 만족하면 실행할 코드를 입력한다.
if 조건식 { //조건을 만족하면 실행 }
else의 활용은 아래와 같다. if에 걸어둔 조건을 만족하지 않는다면 else 중괄호 내의 코드가 실행된다.
if 조건식 { //조건을 만족하면 실행 } else{ //if 조건을 만족하지 않으면 실행 }
if에 걸어둔 조건을 만족하지 않을 경우 else if를 통해 또다른 조건을 명시할 수 있다.
if 조건식1 { //조건1을 만족하면 실행 } else if 조건식2 { //조건1을 만족하지 않으면서 조건2를 만족하면 실행 } else{ //조건1과 2를 모두 만족하지 않으면 실행 }
위의 규칙을 이용해 특정 수가 짝수인지, 홀수인지를 판별해보는 코드를 만들어보면 아래와 같다.
let num = 123
if num >= 0 { //만족하지 않으면 맨 밑에 else 문으로
if num % 2 == 0 {
print("짝수입니다.")
}
else if num % 2 == 1 {
print("홀수입니다.")
}
}
else {
print("음수입니다.")
}
결과 : 홀수입니다.
값이 123인 num이라는 상수를 선언하고, 우선 이것이 0 이상의 수인지 판별한다. 0 이상의 수이면 조건을 만족하므로 조건문 내부로 들어가고, 하위의 조건문들을 통해 2로 나눈 나머지가 0이면 짝수로, 1이면 홀수로 판별한다.
만약 0 이하의 수이면 맨 위의 조건문을 만족하지 못하여 짝수인지 홀수인지 판별하는 작업을 하지 않고 맨 아래의 else문의 코드가 실행된다.
Switch문은 값의 일치 여부에 따라 실행할 코드가 결정된다. 기본적인 형식은 아래와 같다.
switch 비교대상{ case pattern : //pattern과 일치하면 실행될 명령 case pattern1, pattern2 : //두개의 값 중에 하나라도 일치하면 실행 default : //나머지 경우에 실행 }
여기서 눈에 띄는 부분은 두번째 case에 값을 여러개 써준 것인데, 여러개의 값(패턴) 중에 일치하는 것이 하나라도 있다면 하위 명령이 실행된다. 마지막의 default는 if 문에서 else와 같은 역할로, case에서 비교하는 값 중에 일치되는 것이 없을 경우 실행된다.
case문은 switch 블록 내에서 하나 이상 반드시 존재해야 하며, default는 비교대상이 가질 수 있는 모든 경우의 값들을 위에 case들에 명시해주었다면 생략이 가능하다. 추가로, case와 default문에는 반드시 한줄 이상의 실행 코드가 있어야 한다는 점을 명심하자.
let num = 4
switch num {
case 1 :
print("one")
case 2 :
print("two")
case 3, 4 :
print("three or four")
default :
break
}
결과 : three of four
4를 값으로 가지는 num이라는 상수를 선언한 후, switch 문을 통해 비교를 하는 과정이다. 4가 세번째 case에 명시되어 있으므로 print("three or four")가 실행되면서 해당 switch문을 탈출한다.
당연한 소리지만, 위 switch 문에서 정수형으로 표현할 수 있는 모든 값들이 case에서 명시되지 않았으므로 default를 명시해주어야 하며, default 조건을 만족 시 해당 switch문을 탈출하는 break가 실행된다.
case에 일치 여부를 판별하도록 선언한 pattern에 where을 통해 세부 조건을 명시할 수 있다. 형식은 아래와 같다.
switch 비교대상{ case pattern where condition : //실행 코드 default : //실행 코드 }
패턴과 그 패턴에 대한 세부조건이 where에 명시되고, 이 두가지를 모두 만족해야만 해당 case의 실행 코드가 실행된다. 이것을 활용한 예제는 아래와 같다.
let num = 4
switch num {
case let x where x <= 10 :
print(x)
default :
break
}
결과 : 4
case에서 pattern을 명시하는 부분에 기존에는 case 4 : 이런식으로 값을 적었다면, 이번엔 let x라는 코드를 썼다. 이것은 '값 바인딩'이라는 문법이다. (값 바인딩에 대해선 아래에서 설명하겠다.)
우선 위 코드의 경우 num이 case 안에 있는 상수 x에 대입되고, 그 값을 where의 조건식으로 판별한다. 10보다 작다는 조건을 만족하므로 print(x)가 실행된다.
case let name: case var name:
switch 문에서 비교할 대상을 상수나 변수에 대입하여 사용하는 문법이다.
let number = 1
switch number{
case let x :
print(x)
}
결과 : 1
x에 number가 대입되어서 case의 비교에 사용되는 모습이다. 보통 아래와 같이 where절과 함께 조건을 걸어 사용하곤 한다.
let number = 1
switch number{
case let x where x == 0 :
print("number의 값은 0")
default :
print("해당 없음")
}
결과 : 해당 없음
case 내부에서 바인딩된 상수 x는 해당 case나 스위치를 벗어나서 사용할 수 없다. 만약 다른 case에서 또 한번 값 바인딩을 통해 다른 값으로 비교하고 싶다면 아래와 같이 새롭게 바인딩하여 사용해주면 된다.
let number = 1
switch number{
case let x where x == 0 :
print("number의 값은 0")
case let y where y == 1 :
print("number의 값은 1")
default :
print("해당 없음")
}
결과 : number의 값은 1
이번엔 특정 값만 비교하는 것이 아닌, 비교할 범위를 정하여 일치 여부를 묻는 Interval Matching에 대해 알아보자.
let battery = 13
switch battery {
case 0..<15 : //0부터 15미만
print("배터리 부족")
case 15...50 :
print("일반 배터리")
case 51...80 :
print("배터리 여유")
case 81... : //81 이상
print("배터리 충분")
default:
print("전원 꺼짐")
}
결과 : 배터리 부족
battery의 값이 13이니 첫번째 case에 범위가 포함되어 print("배터리 부족") 코드가 실행되는 모습이다.
switch 문은 비교 대상의 값과 case의 pattern이 일치하면 해당 case의 실행 코드를 실행시킨 후 switch 문을 탈출해버린다. 하지만 실행 코드에 fallthrough를 붙이게 되면 일치하는 case를 발견한 후 해당 case문의 실행코드를 실행시킨 후, switch 문을 탈출하지 않고 바로 다음번 case를 강제 실행시킨다. 예시 코드를 통해 둘의 차이점을 비교해보자.
//fallthrough 미사용
let num = 2
switch num {
case 1:
print("one")
case 2:
print("two")
case 3:
print("three")
default:
print("others")
}
결과 : two
fallthrough를 사용하지 않으면 두번째 케이스와 값이 일치하므로 two가 출력되고 그대로 switch 문은 종료된다. 이번엔 사용한 코드를 보자.
//fallthrough 사용
switch num {
case 1:
print("one")
case 2:
print("two")
fallthrough //다음번 case를 값의 일치여부와 관계없이 실행
case 3:
print("three")
default:
print("others")
}
결과 : two
three
case 2의 값과 일치하여 two가 실행되고, fallthrough가 명시되어 있기에 값의 일치여부와 상관 없이 다음번 case가 실행되어 "three" 까지 출력되고 switch문을 탈출한다.