본문 바로가기

Swift

[Swift] Enum 열거형 정복하기 2편 (Enum Case Pattern)

연관값(associated values)을 가진 열거형(enumeration)의 case를 매칭시킬 때 이 패턴을 사용합니다. switch 문, if 문, guard 문, for-in 문, while 문에서 모두 사용이 가능합니다.

 

기본적인 문법을 먼저 살펴보도록 하겠습니다.

 

case Enum.case(let name):
case Enum.case(var name):

 

각 케이스의 연관값은 상수나 변수로 바인딩이 가능합니다.

 

case let Enum.case(name):
case var Enum.case(name):

바인딩 방식이 동일하다면 let, var 키워드를 case 뒤에 바로 써줍니다.

 

대부분의 경우, 열거형의 형식은 추론이 가능하기 때문에 열거형 이름은 생략이 가능합니다. 열거형 이름을 생략하여 코드를 깔끔하게 작성할 수도 있습니다. where 절을 추가하여 부가적인 조건 지정도 가능합니다.

 

예시를 통해 case pattern을 알아보겠습니다.

 

enum Transportation {
    case bus(number: Int)
    case taxi(company: String, number: String)
    case subway(line: Int, express: Bool)
}

 

교통수단에 대한 열거형을 정의하였습니다. 각 케이스마다 연관값이 지정되어 있습니다.

switch 문

var commute = Transportation.bus(number: 7)

switch commute {
case .bus(let number):
    print(number)
case .taxi(let company, _):
    // 바인딩할 필요가 없는 연관값은 와일드 카드 패턴 사용
    print(company)
case let .subway(line, express):
    // 연관값에 저장된 모든 값을 상수에 바인딩
    // 모든 연관값을 동일한 방식으로 바인딩할때 사용
    print(line, express)
}

if 문

commute = Transportation.subway(line: 2, express: false)

// 2호선 지하철
if case let .subway(2, express) = commute {
    if express {
    // 급행인 경우
    } else {
    // 급행이 아닌 경우
    }
}

// 급행 지하철
if case .subway(_, true) = commute {
    print("express")
}

for 문

let list = [
    Transportation.subway(line: 2, express: false),
    Transportation.bus(number: 4412),
    Transportation.subway(line: 7, express: true),
    Transportation.taxi(company: "Kakao", number: "1234")
]

// 지하철
for case let .subway(n, _) in list {
    print("subway \(n)")
}
// Prints "subway 2"
// Prints "subway 7"

// 급행 지하철
for case let .subway(n, true) in list {
    print("subway \(n)")
}
// Prints "subway 7"

// 지하철 중 2호선만
for case let .subway(n, _) in list where n == 2 {
    print("subway \(n)")
}
// Prints "subway 2"

정리

  • 연관값을 가지는 열거형의 case를 매칭시키는 법을 알아보았습니다.
  • 반복문, 조건문에서 case pattern을 사용할 수 있습니다.
  • where 키워드를 통해 부가적인 조건을 추가할 수 있습니다.

태그