이번 노트에서는 switch-case문
에서 여려 value
를 사용하는 법을 작성하려한다.
swift에서는 열거 형태의 값들을 switch-case
를 통해 비교하고 처리하는 기능이 다른 언어에 비해 강력
하다.
if-else
를 사용하는 방법도 있지만 코드의 가독성이 나빠지고
, 코드의 길이 또한 길어지게 된다. 그래서 나는 보통 열거(Enum)형태의 값을 처리할 땐 switch-case문을 사용한다.
그럼 기본적인 switch-case문의 구동 방식을 알고 있다는 전제하에 이번 노트를 작성한다.
switch에서 여러 value를 사용하는 것은 일반 switch-case와 비슷하다. 예시를 보자.
우선 다음과 같은 열거형 데이터
를 정의했다고 하자. (필자가 자동차를 좋아하기에.. 지극히 주관적인 취향..)
enum Manufacturers {
case hyundai, kia, bmw, mercedes, chevrolet, ford
}
enum Vehicles {
case grandure, k7, x5, eClass, impala, mustang
}
struct CarData {
let manufacturer: Manufacturers?
let vehicle: Vehicles?
}
제조사 이름이 담긴 enum
과 차량 이름이 담긴 enum
을 만들었고, 제조사(manufacturer)와 차량 이름(vehicle)이 담긴 구조체
도 각각 옵셔널(optional)
형태로 선언했다.
let carData = CarData(manufacturer: .hyundai, vehicle: .grandure)
앞서 선언한 구조체에 위와 같은 데이터가 적용되어 있다고 보자.
이제 switch-case문
을 활용하여 위의 데이터를 찾아보자.
switch (carData.manufacture, carData.vehicle) {
case (.hyundai, .grandure):
print("manufacturer: Hyundai / vehicle: Grandure")
case (.kia, .k7):
print("manufacturer: KIA / vehicle: K7")
case (.bmw, .x5):
print("manufacturer: BMW / vehicle: X5")
case (.mercedes, .eCalss):
print("manufacturer: Mercedes Benz / vehicle: E-Class")
case (.chevrolet, .impala):
print("manufacturer: Chevrolet / vehicle: Impala")
case (.ford, .mustang):
print("manufacturer: Ford / vehicle: MUSTANG")
default:
print("manufacturer: nil / vehicle: nil")
}
// print >> "manufacturer: Hyundai / vehicle: Grandure"
그렇다 비교하고자 하는 value
를 ()
를 통해 switch
에 선언하고, case
에 switch에 선언한 순서대로 ()
에 값들을 비교해 찾는다.
위의 예시에서 switch의 manufacturer
와 vehicle
이 carData
의 데이터와 일치하는 첫 번째 case의 값이 출력되는 것이다.
그렇다면 여기서 의문이 들것이다. 앞서 우리는 CarData
구조체의 manufacturer
와 vehicle
을 옵셔널로 선언했다. 그렇다면 값이 없는 nil
일 수도 있다는 얘긴데...
값이 nil
인 경우를 보자.
let carData = CarData(menufacture: .bmw, vehicle: nil)
carData의 vehicle의 값이 nil이다. 그럼 위의 switch-case 코드에서는 일치하는 값이 없어 default
로 빠지게된다.
하지만 다음 방법으로 데이터가 nil일 경우를 처리해 줄 수 있다.
switch (carData.manufacture, carData.vehicle) {
case (.hyundai, .grandure):
print("manufacturer: Hyundai / vehicle: Grandure")
case (.kia, .k7):
print("manufacturer: KIA / vehicle: K7")
case (.bmw, .x5):
print("manufacturer: BMW / vehicle: X5")
case (.bmw, _):
print("manufacturer: BMW / vehicle: nil")
case (.mercedes, .eCalss):
print("manufacturer: Mercedes Benz / vehicle: E-Class")
case (.chevrolet, .impala):
print("manufacturer: Chevrolet / vehicle: Impala")
case (.ford, .mustang):
print("manufacturer: Ford / vehicle: MUSTANG")
default:
print("manufacturer: nil / vehicle: nil")
}
// print >> "manufacturer: BMW / vehicle: nil"
위의 case의
case (.bmw, _):
를 보면 _
표현식으로 nil의 값이 처리되는 것을 볼 수 있다.
그 밖에 사용법은 일반적인 switch-case
와 동일하다.
nil
인 값까지 처리할 수 있어 여러 상태에 대한 값에 대응 가능해 if-else
에 비해 코드 길이가 줄고, 가독성 또한 좋아지는 것(지극히 주관적인 제 생각입니다..) 같았다.
끝~~~