카테고리 없음
Swift) 열거형
나태한개발
2024. 6. 14. 22:09
열거형 정의
열거형은 enum 키워드를 사용하여 정의한다. 각 케이스는 열거형의 가능한 값을 나타낸다.
enum CompassPoint {
case north
case south
case east
case west
}
열거형 CompassPoint는 네 개의 방향을 나타내는 값을 가진다.
열거형 사용
열거형 값을 변수나 상수에 할당하고 사용할 수 있다.
var direction = CompassPoint.north
// 열거형 값 변경
direction = .east
스위프트는 타입 추론을 통해 열거형 타입을 알 수 있기 때문에, 열거형 타입이 명확한 경우에는 .east처럼 간단히 작성할 수 있다.
열거형과 스위치 문
열거형 값에 따라 다른 동작을 수행하려면 스위치(switch) 문을 사용할 수 있다.
switch direction {
case .north:
print("북쪽")
case .south:
print("남쪽")
case .east:
print("동쪽")
case .west:
print("서쪽")
}
스위치 문에서 열거형의 모든 케이스를 반드시 처리해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
연관 값(Associated Values)
열거형의 각 케이스에 연관 값을 추가할 수 있다. 이를 통해 케이스마다 다른 타입의 값을 가질 수 있다.
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
연관 값을 가진 열거형을 사용할 때는 스위치 문을 사용하여 값을 추출할 수 있다.
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let code):
print("QR Code: \(code)")
}
원시 값(Raw Values)
열거형 케이스에 정수, 문자열 등의 원시 값을 할당할 수 있다. 이를 통해 열거형 케이스를 더 간결하게 표현할 수 있다.
enum Planet: Int {
case mercury = 1
case venus
case earth
case mars
}
let earthOrder = Planet.earth.rawValue // 출력: 3
if let somePlanet = Planet(rawValue: 2) {
print(somePlanet) // 출력: venus
}
열거형 메서드
열거형에 메서드를 정의하여 관련 기능을 추가할 수 있다.
enum CompassPoint {
case north
case south
case east
case west
func description() -> String {
switch self {
case .north:
return "북쪽"
case .south:
return "남쪽"
case .east:
return "동쪽"
case .west:
return "서쪽"
}
}
}
let direction = CompassPoint.east
print(direction.description()) // 출력: 동쪽
열거형의 활용
열거형은 코드의 가독성을 높이고, 타입 안전성을 유지하며, 특정 값의 집합을 정의할 때 유용하다. 예를 들어, 네트워크 요청의 결과를 열거형으로 표현할 수 있다.
enum NetworkResult {
case success(Data)
case failure(Error)
}
func handleNetworkResult(_ result: NetworkResult) {
switch result {
case .success(let data):
print("성공: \(data)")
case .failure(let error):
print("실패: \(error)")
}
}