[Swift] 열거형

HongDuHyeon·2023년 4월 2일
0
post-thumbnail
점점 어려워지는 것 같은데~~

열거형이란?

  • 연관성이 있는 값을 모아 놓은 것을 말한다.
    예를 들어 계절 - 봄, 여름, 가을, 겨울처럼 연관된 것을 모아놓는 것처럼 프로그래밍에서도 가능하다.

표기법

값 하나하나 case에 써줘도 되지만 축약형으로 case 하나에 쉼표로 구분해서 작성해줘도 된다.

enum CompassPoint: String {
    case north
    case south
    case east
    case west
}
// 축약형
enum CompassPoint: String {
    case north, south, east, west
}

switch/case 예제

switch/case문에서 먼저 direction을 선언해주고 case문에 .만 작성해도 enum의 case가 보이기 때문에 switch/case를 활용할 수도 있다.

enum CompassPoint: String {
    case north, south, east, west
}

var direction = CompassPoint.east
direction = .west

switch direction {
case .north:
    print("north")
case .west:
    print("west")
case .south:
    print("south")
case .east:
    print("east")
}

// west

타입 명시

만약 내가 원시값으로 초기화 하고 싶다면 위에서 설명한 축약형이 아닌 풀어서 쓰는게 가독성이 좋아보인다.

enum CompassPoint: String {
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

보통 다른 프로그래밍 언어에선 Int형 타입만 원시값을 가질 수 있지만 swift에선 모든 타입에서 원시값을 가져올 수 있다.

추가로 rawValue로 가져올 수 있다.

enum CompassPoint: String {
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

var direction = CompassPoint.east
direction = .west

switch direction {
case .north:
    print(direction.rawValue)
case .west:
    print(direction.rawValue)
case .south:
    print(direction.rawValue)
case .east:
    print(direction.rawValue)
}

// 서

추가로 열거형을 반환하게 할 수도 있다. 방법은 열거형 인스턴스를 생성할 때 매개변수로 원시값을 넘겨주면 된다.

enum CompassPoint: String {
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

let direction2 = CompassPoint(rawValue: "남")
// south

연관값

열거형안에 항목이 자신과 연관된 값을 가질 수 있다는 뜻이다.
각 항목 옆에 소괄호로 묶어 사용할 수 있고 다른 항목이 연관값을 갖는다고 모든 값이 연관값을 가져야하는 것은 아니다.

enum PhoneError {
    case unknown
    case batteryLow(String)
}

좀 더 활용해보면

enum PhoneError {
    case unknown
    case batteryLow(String)
}

let error = PhoneError.batteryLow("배터리가 곧 방전됩니다.")
// batteryLow("베터리가 곧 방전됩니다.")

연관값을 추출하려면 if case 또는 switch문을 활용해야한다.

enum PhoneError {
    case unknown
    case batteryLow(String)
}

let error = PhoneError.batteryLow("배터리가 곧 방전됩니다.")

switch error {
case .batteryLow(let message):
    print(message)
case .unknown:
    print("알수없는 에러입니다.")
}

// 배터리가 곧 방전됩니다.

switch문을 활용해서 .batteryLow에 있는 메세지 값을 추출해서 사용할 수 있다.

profile
마음이 시키는 프론트엔드.. RN과 IOS를 곁들인..

0개의 댓글