[swift]- switch case문 multiple values 사용하기

모리스·2024년 1월 10일
0

swift

목록 보기
3/4
post-thumbnail

이번 노트에서는 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의 manufacturervehiclecarData의 데이터와 일치하는 첫 번째 case의 값이 출력되는 것이다.

그렇다면 여기서 의문이 들것이다. 앞서 우리는 CarData 구조체의 manufacturervehicle을 옵셔널로 선언했다. 그렇다면 값이 없는 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에 비해 코드 길이가 줄고, 가독성 또한 좋아지는 것(지극히 주관적인 제 생각입니다..) 같았다.

끝~~~

profile
모바일 앱 개발 노트 :)

0개의 댓글