본문 바로가기

Swift 스위프트

스위프트(Swift) 5 - 조건문

728x90
728x90

이 게시글은 독자가 어느정도 프로그래밍을 알고 있다 가정하고 작성되었다.

if

스위프트의 if문은 들어갈 조건에 소괄호를 생략할 수 있다.

let a: Int = 20
let b: Int = 20

if a == b {
    print("서로 같은 수")
}
else if (a > b) {
    print("a가 더 큼")
}
else {
    print("b가 더 큼")
}

스위프트에서 조건으로 들어가는 구문은 반드시 Bool 자료형이 들어가야만 한다.

let a: Int = 1
if a {
    print("a는 Bool이 아닌 Int이므로 컴파일 에러가 발생한다.")
}

switch

스위프트에서 스위치 사용은 꽤 자유롭다.

let s: String = "Kim"

switch s {
    case "Park":
        print("정수 뿐만 아니라 다양한 자료형을 사용할 수 있다.")
    case "Kim":
        print("스위프트는 맞는 케이스에 도달하면 알아서 break 된다.")
        print("만약 다른 언어처럼 케이스를 계속 진행시키길 원한다면")
        print("해당 케이스 맨 아래 키워드 fallthrough를 넣어줘야 한다.")
        fallthrough
    default:
        print("Not found")
}

스위프트는 break를 넣지 않더라도 조건에 만족되면 코드를 실행한 뒤 스위치문을 빠져나오며 명확하게 표현하길 원하면 break를 따로 넣어도 무방하다.

fallthrough 키워드를 이용하여 case를 계속 검사할지 정할 수 있다.

단일 변수 뿐만 아니라 여러 변수를 넣거나 범위를 지정하는 것도 가능하다.

let score: Int = 50

switch score {
    case 0:
        print("Zero")
    case 1...95:
        print("Higher than 0 and lower than 96")
    case 96, 97, 98, 99:
        print("Higher than 95 and lower than 100")
    case 100:
        print("One hundred")
    default:
        print("The score is lower than 0 or higher than 100")
}

1...99는 1부터 99까지의 정수를 나타낸 것이다. 이에 대해선 나중에 반복문을 다룰 때 자세히 설명한다.

각 case는 반드시 실행 코드를 가지고 있어야 함

어떤 스위치 구문에 아무 코드가 없다면 컴파일 에러를 발생시킨다.

switch "test" {
    case "test": // test 케이스에서 실행 코드가 없어 컴파일 에러가 발생한다.
    default:
        print("No test")
}

튜플과 와일드 카드(_)

스위프트도 튜플이 있는데 튜플로 스위치를 돌릴 경우 언더스코어를 사용하여 어떤 값을 무시하고 검사를 하게 할 수 있다.

let profile: (name: String, age: Int) = (name: "Park", age: 34)

switch profile {
    case (_, 34):
        print("나이가 동일합니다.")
        fallthrough
    case ("Park", _):
        print("이름이 동일합니다.")
        fallthrough
    case ("Park", 34):
        print("모든 정보가 동일합니다.")
    default:
        print("모든 정보가 동일하지 않습니다.")
}

스위프트의 switch는 모든 경우에 대한 대비가 되어 있어야 함

다음 코드는 컴파일 에러를 일으킨다.

let test: Int = 19;

switch test {
    case 19:
        print("190")
}

이런 식의 스위치문을 작성하고 컴파일을 시도할 시 switch must be exhaustive라는 오류가 뜨는데 이는 스위치를 사용할 때 모든 케이스에 대한 동작이 있어야 한다는 것이다.

케이스의 마지막으로 default 를 넣을 것이 강제된다. default 말고도 언더스코어로 표현을 대체할 수 있다.

복잡한 경우에 대한 처리

스위치에서 default를 넣을 경우 해당 스위치에서 어떤 데이터를 처리하느냐에 따라 Case will never be executed라는 경고를 보여줄 때도 있는데 이를 엄격하게 하기 위해 @unknown 키워드를 사용할 수 있다.

let test: Int = 19;

switch test {
    case 19:
        print("190")
    @unknown case _:
        print("what")
}

이렇게 default 앞에 붙여 경고 대신 switch must be exhaustive 에러를 일으키도록 할 수 있다.

복잡한 개체를 스위치로 다룰 때 처리하지 않은 케이스를 코더에게 알려주는 용도로 이용할 수 있다.

728x90
728x90