Swift - 열거형 매칭(Enumeration Matching)

이재원·어제
0

Swift

목록 보기
15/15
post-thumbnail

스위프트 열거형은 단순히 특정 상태를 표현하는 것을 넘어서 연관 값을 저장하고, 이 값을 통해 더 많은 정보를 포함할 수 있는 데이터 구조입니다. 특히, 열거형과 함께 사용되는 패턴 매칭(Pattern Matching)은 코드를 간결하고 명확하게 작성할 수 있도록 도와줍니다.

이번 글에서는 스위프트 열거형의 패턴 매칭에 대해 개념부터 사용법까지 알아보겠습니다.

열거형에서 연관 값이란

열거형은 각 case가 연관 값(Associated Values)를 가질 수 있습니다. 연관 값은 열거형이 상태를 표현할 뿐만 아니라, 상태에 필요한 데이터를 함께 저장할 수 있습니다.

enum APIRequest {
	case uploadFile(image: Data) // Data를 연관 값으로 가짐
	case downloadFile(id: String) // id를 연관 값으로 가짐
	case deleteFile(id: String) // id를 연관 값으로 가짐
	case listFiles
}

연관 값은 각 case가 고유한 데이터를 가질 수 있도록 해주며, 열거형의 활용도를 높이는 중요한 기능입니다.

패턴 매칭(Pattern Matching)

패턴 매칭은 열거형 값에서 특정 case를 식별하고, 필요한 데이터를 추출하여 사용할 수 있도록 하는 방법입니다. 이를 통해 연관 값에 쉽게 접근할 수 있습니다.

switch 문에서 패턴 매칭

func handleRequest(_ request: APIReqeust) {
	switch request {
		case .uploadFile(let image): // 연관 값 추출
			print("Uploading file with size: \(image.count)")
		case .downloadFile(let id):
			print("Downloading file with ID: \(id)")
		case .deleteFile(let id):
			print("Deleting file with ID: \(id)")
		case .listFiles: // 연관 값이 없는 상태
			print("Listing all files")
	}
}
	
let request = APIRequest.uploadFile(image: Data([0x89, 0x50]))
handleRequest(request) // Uploading file with size: 2 bytes

switch문에서 .uploadFile(let image)는 연관 값인 image를 꺼내옵니다.

.listFiles는 연관 값이 없으므로 단순히 상태를 확인만 합니다.

if case를 사용한 특정 케이스 확인

let request = APIRequest.downloadFile(id: "12345")
if case .downloadFile(let id) = request {
	print("Download requested for file ID: \(id)")
}

// 출력값: Download requested for file ID: 12345

guard case를 사용한 값 보호

guard case는 특정 case가 아닌 경우 빠르게 종료하는 로직을 작성할 때 사용합니다.

func handleDeleteRequest(_ request: APIRequest) {
    guard case .deleteFile(let id) = request else {
        print("This is not a delete request.")
        return
    }
    print("Processing delete request for file ID: \(id)")
}

let deleteRequest = APIRequest.deleteFile(id: "56789")
handleDeleteRequest(deleteRequest)

연관 값 추출의 다양한 방식

연관 값을 추출할 때는 let을 사용하여 값을 상수로 추출하거나, var를 사용해 값을 변경할 수 있습니다.

switch request {
case .uploadFile(let image): // 상수로 추출
    print("Image size: \(image.count) bytes")
    
case .deleteFile(var id): // 변수로 추출
    id = "Modified-\(id)"
    print("Modified file ID: \(id)")
    
default:
    break
}

마무리

스위프트의 열거형과 패턴 매칭은 UI 상태 관리, 네트워크 요청 처리, 로직 분리 등 다양한 상황에서 활용할 수 있습니다. 또한 코드의 가독성과 안정성을 크게 향상시킬 수 있습니다. 저도 앞으로는 자주 사용하도록 노력해 봐야 되겠어요.

참고자료
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/enumerations/#app-top
https://www.kodeco.com/1008-pattern-matching-in-swift?page=2#toc-anchor-007

profile
20학번 새내기^^(였음..)

0개의 댓글