Enum, Switch

Joohyun·2022년 3월 3일
0

Enum

  • 가능한 값이 구체적으로 한정되어 정해져 있을 때, 가능한 값끼리 모아 하나의 type을 생성
enum LunchChoice {
    case pasta
    case burger
    case soup
    case taco
// 한줄로 압축 가능
enum LunchChoice {
    case pasta, burger, soup, taco
  • 만약 변수의 타입이 특정한 enum으로 정해져 있다면 enum 이름을 생략하여 표현 가능
enum LunchChoice {
    case pasta, burger, soup
}

var choice: LunchChoice
choice = LunchChoice.burger
// LunchChoice 생략 가능
choice = .burger
  • class, struct, enum 모두 type을 정의하는 것.
    따라서, enum 내부에도 property와 method 존재 가능
enum Suit {
    case spades, hearts, diamonds, clubs
    
    // computed property
    var rank: Int {
        switch self {
        case .spades: return 4
        case .hearts: return 3
        case .diamonds: return 2
        case .clubs: return 1
        }
    }
    
    // method
    func beats(_ otherSuit: Suit) -> Bool {
        return self.rank > otherSuit.rank
    }
}

Switch

  • If 함수와 비슷하게 변수의 값에 따라 분기 처리하여 다른 코드 실행
enum LunchChoice {
    case pasta
    case burger
    case soup
}

let choice = LunchChoice.burger

switch choice {
    case .pasta:
        "🍝"
    case .burger:
        "🍔"
    default:
        "🍲"
}

Exhaustive

  • If 함수와 다르게 Switch 함수는 모든 경우에 따른 분기처리가 완료되어야 한다.
enum LunchChoice {
    case pasta
    case burger
    case soup
    case taco
}

let choice = LunchChoice.burger
  • If
    taco에 대한 분기처리가 없어도 에러가 발생하지 않음
if choice == .pasta {
    return "🍝"
} else if choice == .burger {
    return "🍔"
} else if choice == .soup {
    return "🍲"
}
  • Switch
    taco에 대한 분기처리가 없으므로 Switch must be exhaustive. 에러 발생
    (추가로, if문을 썼을 때보다 코드가 깔끔해짐)
switch choice { // Switch must be exhaustive. 에러 발생 !
case .pasta:
    "🍝"
case .burger:
    "🍔"
case .soup:
    "🍲"
}

따라서, App의 안정성을 위해 enum을 사용할 경우 Switch로 분기처리를 하는 것이 좋다.

하지만 아래처럼 Switch에 default를 포함시켜 코드를 작성하면,
enum에 새로운 값을 추가하여도 Switch문에 에러가 나지 않으므로
App의 안정성이 떨어진다.
그러므로 이 경우에는 default문 쓰지 않는게 좋다.

enum LunchChoice {
    case pasta
    case burger
    case soup
    case taco
}

let choice = LunchChoice.burger

switch choice {
    case .pasta:
        "🍝"
    case .burger:
        "🍔"
    // soup, taco일때 모두 아래 코드 실행
    default:
        "🍲"
}
profile
IOS Developer

0개의 댓글