Swift - Enum

이한솔·2023년 9월 17일
0

Swift 문법 🍎

목록 보기
23/32

Enumeration

연관된 상수들을 하나의 이름으로 묶은 타입
공통된 주제에 대해서 이미 정해놓은 입력 값만 선택해서 받고 싶을 때 주로 사용하며 코드 가독성과 안정성이 높아진다. 또한 Heap에 저장되는 String과 달리, Enum은 값 형식으로 Stack에 저장되어 성능도 향상된다.

// 이렇게 변수로 선언 해서 사용할때마다 직접 입력해야하면 
// 개수가 많아질수록 가독성과 안정성이 떨어진다.
var left = "left"
var right = "right"
var center = "center"


Enum 기본 형태

enum 자체가 하나의 독립적인 타입이 되므로 UpperCamelCase로 적는다.
각 case는 lowerCamelCase로 적고, 각각의 case도 고유의 형태로 취급된다.

// enum 정의 첫번째 방법
enum Alignment {
   case left
   case right
   case center 
}

// enum 정의 두번째 방법
enum Alignment {
    case left, right, center 
}

// 만들어둔 enum타입이 되고 .(점문법)으로 선언해둔 case에만 접근할 수 있다.
var left = Alignment.left 

// 바꿀때에는 Alignment타입인걸 알고있기 때문에, 열거형의 이름은 생략가능하고 .(점문법)은 생략 불가능하다.
left = .center


열거형과 switch문

switch-case문을 활용하면 열거형 타입을 잘 활용할 수 있다.
열거형 타입은 한정되어 있다고 컴파일러가 인지하기 때문에 case에 해당하는 모든 경우를 구현한다면, default를 적지 않아도 된다.
하지만 case에서 하나라도 빼고 작성한다면 default가 꼭 필요하다.

switch textAlignment {
case .left: 
     print("left")
case .center: 
     print("center")
case .right:
     print("right")
}


원시값 (Raw Value)

케이스와 연관된 또 다른 값을 저장할때 사용한다.
원시값으로 사용 가능한 타입: String, Character, Number Type

// 원시값 저장 부분을 생략하면 지정한 타입마다 규칙에 따라 기본값이 저장됨
enum 타입이름: 원시값타입 {
   case 케이스이름 = 원시값 
}

enum Alignment: Int {
    case left // 0 
    case right = 100
    case center // 101
}

print(Alignment.left.rawValue) // 출력값: 0
print(Alignment.right.rawValue) // 출력값: 100
print(Alignment.center.rawValue) // 출력값: 101

Alignment.left.rawValue = 10 // Error: 원시값은 변경할 수 없음


enum Color: String {
    case apple = "빨강"
    case banana = "노랑"
    case grape
}

// 이 때, 초기화가 된 값들은 호출 했을 때는 해당 값들을 불러오지만 
// 포도와 같이 초기화가 되지 않은 값들은 case의 이름을 가져온다.
print("사과의 색은 \(Color.apple.rawValue)")
// 출력값: 사과의 색은 빨강

print("포도의 색은 \(Color.grape.rawValue)")
// 출력값: 포도의 색은 grape

// rawValue에 값이 없는 경우가 있기 때문에 변수로 사용하려면 옵셔널 타입으로 반환해야 한다.
let fruit: Color? = Color(rawValue: "보라")
print(fruit)
// 출력값: nil

if let color = Color(rawValue: "빨강") {
    print("과일은 \(color)!")
} else {
    print("해당 과일이 없습니다.")
}
// 출력값: 과일은 apple!


// Error: Character 타입의 원시값은 추론할 수 없기 때문에 직접 지정해주어야한다.
enum weekday: Character {
    case monday 
    case tuesday
    case wednesday
}

enum weekday: Character {
    case monday = "m"
    case tuesday = "t"
    case wednesday = "w"
}


열거형에 함수 넣기

enum Month {
    case mar, apr, may
    case jun, jul, aug
    case sep, oct, nov
    case dec, jan, feb
    
    func printMessage() {
        switch self {
        case .mar, .apr, .may:
            print("봄")
        case .jun, .jul, .aug:
            print("여름")
        default:
            print("default")
        }
    }
}

var month = Month.apr
month.printMessage() // 출력값: 봄

month = .dec
month.printMessage() // 출력값: default

0개의 댓글