if구문은 대표적은 조건문으로, if, else 등의 키워드를 사용하여 구현할 수 있다.
정수, 실수 등 0이 아닌 모든 값을 참으로 취급하여 조건 값이 될 수 있었던 다른 언어와는 달리 스위프트의 if구문은 조건의 값이 꼭 Bool타입이어야 한다.
ex) if문 기본 구현
let first: Int = 5
let second: Int = 7
if first > second {
print("first > second")
}else if first < second {
print("first < second")
}else{
print("first = second")
}
ex) if구문의 다양한 구현(소괄호 없는 코드)
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 == second 조건이 충족 되었기 때문에 실행되지 않는다.
biggerValue = 100
}
// 마지막 else, else if는 생략 가능
// else나 else if 없이 if만 단독으로 사용할 수 있다.
ex) if구문의 다양한 구현(소괄호가 있는 코드)
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 == second 조건이 충족 되었기 때문에 실행되지 않는다.
biggerValue = 100
}
switch 구문도 소괄호를 생략할 수 있다. 단, break 키워드 사용은 선택 사항이다.
즉, case 내부의 코드를 모두 실행하면 break 없이도 switch 구문이 종료된다.
따라서 break문을 쓰지 않고 case를 연속 실행하던 트릭을 더 이상 사용하지 못한다.
case를 연속해서 사용하기 위해선 fallthrough 키워드를 사용한다.
C 언어에서는 정수 타입만 들어갈 수 있었으나 스위프트에서는 switch 구문의 조건에 다양한 값이 들어갈 수 있다. 하지만 각 case에 들어가 비교 값은 입력 값과 데이터 타입이 같아야 한다. 또, 비교될 값이 명확히 한정적인 값(열거형 값 등)이 아닐 때는 default를 꼭 작성해줘야 한다. 또, 각 case에는 범위 연산자를 사용할 수도, where 절을 사용하여 조건을 확장할 수도 있다.
ex) switch 구문 기본 구현
let integerValue: Int = 5
switch integerValue{
case 0:
print("Value == zero")
case 1...10:
print("Value == 1~10")
fallthrough
case Int.min..<0, 101..<Int.max:// fallthrough 키워드를 사용하여 실행되도록 함.
print("Value < 0 or Value > 100")
default:
print("10 < Value <= 100")
}
ex) 부동소수 타입의 범위 연산을 통한 switch case 구성
let doubleValue: Double = 13.0
switch doubleValue {
case 0:
print("Value == zero")
case 1.5 ... 10.5:
print("1.5 <= Value <= 10.5")
default:
print("Value == \(doubleValue)")
}
ex) 문자열 switch case 구성
let stringValue: String = "Ronaldo"
switch stringValue {
case "PARK":
print("PARK")
case "Buffon":
print("Buffon")
default:
print(stringValue)
}
ex) 잘못된 case 사용
let stringValue: String = "Ronaldo"
switch stringValue {
case "PARK":
print("PARK")
case "Buffon":
//비어있으므로 오류 발생!
default:
print(stringValue)
}
ex) fallthrough의 사용
let stringValue: String = "Buffon"
switch stringValue {
case "PARK":
print("PARK")
case "Buffon":
fallthrough
case "Ronaldo":
fallthrough
default:
print(stringValue)
}
ex) 튜플 switch case 구성
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("sara", 27)
switch tupleValue{
case ("sara",27):
print("\(tupleValue) GOOD!" )
default:
print("What?")
}
ex)와일드카드 식별자를 사용한 튜플 switch case 구성
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("sara", 29)
switch tupleValue {
case ("sara", 29):
print("GOOOOD!")
fallthrough
case (_,29):
print("나이만 맞음!")
fallthrough
case ("sara",_):
print("이름만 맞음!")
fallthrough
default:
("What??")
}
result
//GOOOOD!
//나이만 맞음!
//이름만 맞음!
ex) 값 바인딩을 사용한 튜플 switch case 구성
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("john", 42)
switch tupleValue {
case ("john", 42):
print("GOOOD!!")
case ("john", let age):
print("이름만 맞음!")
case (let name, 42):
print("나이만 맞음!")
default:
print("??")
}
ex) where를 사용하여 switch case 확장
let 직급: String = "사원"
let 연차: Int = 1
let 인턴인가: Bool = false
switch 직급 {
case "사원" where 인턴인가 == true:
print("인턴")
case "사원" where 연차 < 2 && 인턴인가 == false:
print("신입사원")
case "사원" where 연차 >= 5:
print("연식이 있는 사원")
case "사원":
print("사원")
case "대리":
print("대리")
default:
print("owner?")
}
ex) 열거형을 입력 값으로 받는 switch 구문
let 최종학력: School = School.university
switch 최종학력{
case .primary:
print("유치원")
case .elementary:
print("초등학교")
case .middle:
print("중학교")
case .university:
print("대학교")
case .gradute:
print("대학원")
default:
print("중졸 or 고졸?")
}
ex) menu 열거형의 모든 case를 처리하는 switch 구문의 상태
enum Menu{
case chicken
case pizza
}
let lunchMenu: Menu = .chicken
switch lunchMenu{
case .chicken:
print("황금올리브")
case .pizza:
print("포테이토")
case _: // case== defult:
print("what!")
}
ex) 차후에 Menu 열거형에 추가한 case를 처리하지 않으면 경고를 내어줄 unknown 속성
enum Menu{
case chicken
case pizza
case hamberger
}
let lunchMenu: Menu = .chicken
switch lunchMenu{
case .chicken:
print("황금올리브")
case .pizza:
print("포테이토")
@unknown case _: // case== defult: // @unknown을 사용하여 경고 발생시킴
print("what!")
}