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 |