[Swift] Enum

 

Class, Struct와 함께 Named Type으로 불리는 열거형은 한정된 사례 안에서 정의할 수 있는 타입을 말한다.

Enum의 경우 컴파일 최적화가 되어 있어 필요한 영역에서 적절히 사용하면 좋다.

 

 

정의

enum TypeName {
    case case1
    case case2
    case case3
    ... ...
}
 

 

 

예시

enum Weekday {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
    case sunday
}

var today = Weekday.monday // 오늘은 월요일!
today = .tuesday // 앗, 하루가 지났다. 화요일!
 

이런 식으로 사용할 수 있다!

 

 

 

 

 

원시값과 연관값

이어서, 열거형을 유용하게 사용할 수 있게 하는 기능을 꼽아 보자면 원시값과 연관값이 있다. 하나의 열거형에서 원시값과 연관값을 동시에 사용하는 것은 불가능하며, 처음 보면 비슷~ 하게 다가올 수 있지만 하는 역할이나 선언하는 형태가 다른 넘들이다.

먼저, 원시값의 경우에는 1:1로 값을 매칭시킨다. 각 케이스 하나하나에 숫자나 문자를 매칭시키는 경우에 사용한다.

선언 타입이 hashable type으로 제한되어 있으며, Int, String을 주로 사용한다.

또한, 열거형의 선언 시에 값을 저장한다.(사유: 선언 시에 각 case마다 값이 매칭되니까!) 따라서, 값의 변경이 추후에 불가능하다.

enum Weekday: Int {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
    case sunday
}
 

 

 

예를 들어보면 다음과 같다.

무엇이 다른지 알겠는가?!

Type 이름 옆에 Int라는 Type 이름이 붙었다! 마치 변수의 type을 정의하는 것처럼~

위와 같은 경우에는 컴파일러가 자연스럽게 monday부터 1~7까지 알아서 정의해 준다.

열거형의 예시는 아래와 같다.

Weekday(rawValue: 1) // monday
Weekday(rawValue: 4) // thursday
 

 

 

 

 

다음으로, 연관값의 경우에는 원시값과 달리 1:1로 매칭되지 않는다. 열거형 타입의 각 케이스의 카테고리에 해당하지만, 원시값으로 표현될 수 없는 조금 더 구체적인 정보를 저장해서 사용하려고 할 때 사용된다.

예시를 들어보면, 다음과 같다.

 

enum Login {
    case google(id: String, password: String)
    case naver(id: String, password: String)
    case kakao(id: String, password: String)
}
 

선언 타입에 제한 없이 자유롭게 정의 가능하며 인스턴스 생성 시 값이 저장된다!!!

 

하나의 케이스에 서로 다른 값들을 저장하기 때문에, 하나의 열거형에서 원시값과 연관값을 동시에 사용하는 건 불가능하다!

또한, 연관값을 이용하는 예시를 switch문으로 응용해 보자면 아래와 같다.

 

let person = Login.google(id: "qwerty", password: "0000")
switch person {
case .google(id: _, password: _): print("google 로그인!")
case .kakao(id: _, password: _): print("kakao 로그인!")
case .naver(id: _, password: _): print("naver 로그인!")
}
// "google 로그인!" 출력
 

 

 

솔직히 연관값은 컴퓨터의 CPU 조건이라고 하면 더 이해가 잘 되는 것 같다.

하나의 CPU에 여러 스펙이 있으니까 관련 스펙을 열거형으로 표시하면 좋을 것 같다.

 

 

 

 

 

 

프로퍼티

이전에는 여기까지 정리했었는데, 열거형을 다시 공부하다 보니 그 안에 함수와 프로퍼티까지 넣을 수 있는 걸 알게 되어 추가적으로 정리하게 되었다.

단, 프로퍼티는 저장 프로퍼티가 아니라 연산 프로퍼티만 사용할 수 있다.

 

아래의 예시 코드는 원시값으로 Int값을 가지고, 계산 프로퍼티를 이용해 각 case마다 string값을 가져올 수 있도록 만들었다.

enum Emote: Int, CaseIterable {
    case happy
    case good
    case soso
    case notBad
    case bad
    
    var tag: String {
        switch self {
        case .happy:
            return "happy"
        case .good:
            return "good"
        case .soso:
            return "soso"
        case .notBad:
            return "notBad"
        case .bad:
            return "bad"
        }
    }
    
}

이런 식으로!

 

사용할 때는

let happyStr = Emote.happy.tag // "happy"

이렇게 사용하면 된다.

 

 

 

뭔가 장황하게 설명했던 것 같아서, 다시 정리해 보자면 아래와 같다!

열거형: 특정할 수 있는, 비슷한 친구들을 사례로 묶어 놓은 것이다.

원시값: 열거형의 각 케이스에 문자열이나 숫자를 하나씩! 매칭시킨 값을 말한다.

연관값: 열거형의 각 케이스에 해당하지만, 그에 대한 구체적인 정보를 저장하려고 할 때 사용한다.

 

 

 

'iOS' 카테고리의 다른 글

[SeSAC] August 9, 2023  (0) 2023.08.09
[Swift] instance / Type  (0) 2023.08.01
[UIKit] UITableViewController  (0) 2023.07.27
[Swift] Date.formatted()  (2) 2023.07.27
[UIKit] Button의 title은 setTitle로 설정하자  (2) 2023.07.26