으니의 개발로그

[Swift] 조건문(2) - switch 구문 본문

Swift/책 정리

[Swift] 조건문(2) - switch 구문

아잉으니야 2021. 1. 22. 23:43

[Swift] 조건문(2) - switch 구문

이 글은 Swift 프로그래밍 책을 읽고 요약한 내용입니다.

 

  • break 키워드는 선택 사항이다.
    • case 내부의 코드를 모두 실행하면 break 없이도 switch 문이 종료되기 때문에 break 를 쓰지 않고 case 를 연속 실행하던 트릭을 사용하지 못한다.
    • 스위프트에서 switch 구문의 case 를 연속 실행하려면 fallthrough 키워드를 사용해야 한다.
  • switch 구문의 조건에 다양한 값이 들어갈 수 있으나 각 case 에 들어갈 비교 값은 입력 값과 데이터 타입이 같아야 한다.
  • 비교될 값이 명확히 한정적인 값(열거형 값 등)이 아닐 때는 default 를 꼭 작성해줘야 한다.
  • case 에서는 범위 연산자를 사용할 수도 있고 where 절을 사용하여 조건을 확장할 수도 있다.

 

switch 입력 값 {
  case 비교 값 1:
      실행 구문
  case 비교 값 2:
      실행 구문
      // 이번 case를 마치고 switch 구문을 탈출하지 않는다. 아래 case로 넘어간다.
      fallthrough
  case 비교 값 3, 비교 값 4, 비교 값 5:    // 한 번에 여러 값을 비교할 수 있다.
      실행 구문
      break        // break 키워드를 통한 종료는 선택 사항이다.
  default:    // 한정된 범위가 명확하지 않다면 default는 필수이다.
      실행 구문
}

 

 

  1. 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:
        print("Value < 0 or Value > 100")
        break
    default:
        print("10 < Value <= 100")
    }
    
    /* Value == 1~10 */
    /* Value < 0 or Value > 100 */

 

  1. 부동소수 타입의 범위 연산을 통한 switch case 구성

    import UIKit
    
    let doubleValue: Double = 3.0
    
    switch doubleValue {
    case 0:
        print("Value == zero")
    case 1.5...10.5:
        print("1.5 <= Value <= 10.5")
    default:
        print("Value == \(doubleValue)")
    }
    
    /* 1.5 <= Value <= 10.5 */

 

  1. 문자열 switch case 구성

    import UIKit
    
    let stringValue: String = "Liam Neeson"
    
    switch stringValue {
    case "yagom":
        print("He is yagom")
    case "Jay":
        print("He is Jay")
    case "Jenny", "Joker", "Nova":
        print("He or She is \(stringValue)")
    default:
        print("\(stringValue) said 'I don't know who you are'")
    }
    
    /* Liam Neeson said 'I don't know who you are' */

 

  1. 잘못된 case 사용

    import UIKit
    
    let stringValue: String = "Liam Neeson"
    
    switch stringValue {
    case "yagom":
        print("He is yagom")
    case "Jay":
        print("He is Jay")
    
    case "Jenny":
        // stringValue가 "Jenny"에 해당할 때 실행될 코드가 와야함
        // 비어있으므로 오류 발생
    case "Joker":
        // stringValue가 "Joker"에 해당할 때 실행될 코드가 와야함
        // 비어있으므로 오류 발생!
    case "Nova":
        print("He or She is \(stringValue)")
    default:
        print("\(stringValue) said 'I don't know who you are'")
    }

 

  1. fallthrough의 사용

    import UIKit
    
    let stringValue: String = "Joker"
    
    switch stringValue {
    case "yagom":
        print("He is yagom")
    case "Jay":
        print("He is Jay")
    case "Jenny":
        fallthrough
    case "Joker":
        fallthrough
    case "Nova":
        print("He or She is \(stringValue)")
    default:
        print("\(stringValue) said 'I don't know who you are.'")
    }
    
    /* He or She is Joker */

 

  1. 와일드카드 식별자를 사용한 튜플 switch case 구성

    typealias NameAge = (name: String, age: Int)
    
    let tupleValue: NameAge = ("yagom", 99)
    
    switch tupleValue {
    case ("yagom", 50):
        print("정확히 맞췄습니다!")
    case ("yagom", _):
        print("이름만 맞았습니다. 나이는 \(tupleValue.age)입니다.")
    case (_, 99):
        print("나이만 맞았습니다. 이름은 \(tupleValue.name)입니다.")
    default:
        print("누굴 찾나요?")
    }
    
    /* 이름만 맞았습니다. 나이는 99입니다. */

 

  1. 값 바인딩을 사용한 튜플 switch case 구성

    typealias NameAge = (name: String, age: Int)
    
    let tupleValue: NameAge = ("yagom", 99)
    
    switch tupleValue {
    case ("yagom", 50):
        print("정확히 맞췄습니다!")
    case ("yagom", let age):
        print("이름만 맞았습니다. 나이는 \(age)입니다.")
    case (let name, 99):
        print("나이만 맞았습니다. 이름은 \(name)입니다.")
    default:
        print("누굴 찾나요?")
    }
    
    /* 이름만 맞았습니다. 나이는 99입니다. */

 

  1. 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("사장입니까?")
    }
    
    /* 신입사원입니다. */

 

  1. 열거형을 입력 값으로 받는 switch 구문

    enum School {
        case primary, elementary, middle, high, college, university, graduate
    }
    
    let 최종학력: School = School.university
    
    switch 최종학력 {
    case .primary:
        print("최종학력을 유치원입니다.")
    case .elementary:
        print("최종학력을 초등학교입니다.")
    case .middle:
        print("최종학력을 중학교입니다.")
    case .high:
        print("최종학력을 고등학교입니다.")
    case .college, .university:
        print("최종학력을 대학(교)입니다.")
    case .graduate:
        print("최종학력을 대학원입니다.")
    }
    
    /* 최종학력을 대학(교)입니다. */

 

  1. Menu 열거형의 모든 case를 처리하는 switch 구문의 상태

    enum Menu {
        case chicken
        case pizza
    }
    
    let lunchMenu: Menu = .chicken
    
    switch lunchMenu {
    case .chicken:
        print("반반 무많이")
    case .pizza:
        print("핫소스 많이 주세요")
    case _: // case default: 와 같은 표현이다
        print("오늘 메뉴가 뭐죠?")
    }
    
    /* 반반 무많이 */

 

  1. 차후에 Menu 열거형에 추가한 case를 처리하지 않으면 경고를 내어줄 unknown 속성

    enum Menu {
        case chicken
        case pizza
        case hamburger
    }
    
    let lunchMenu: Menu = .chicken
    
    switch lunchMenu {
    case .chicken:
        print("반반 무많이")
    case .pizza:
        print("핫소스 많이 주세요")
    @unknown case _:
        print("오늘 메뉴가 뭐죠?")
    }
    
    /* 반반 무많이 */