Enum은 관련된 값 여러 개를 같은 타입을 통해 그룹으로 묶어서 타입 안정성을 보장하는 방법이다.
열거형은 case를 통해 여러 개의 값을 넣어줄 수 있다.
enum Weekday {
case mon
case tue
case wed
case thu, fri, sat, sun
//여러 개의 케이스는 이렇게 ,로 나눠서 넣을 수도 있음
}
//열거형 인스턴스 생성 및 사용
var whatDay = Weekday.mon
var anotherWhatDay = whatDay // 값 복사
whatDay = .wed // 값을 변경해도 anotherWhatDay에는 영향 X
print(whatDay) // 출력값 wed
print(anotherWhatDay) // 출력값 mon
switch case 조건문과 연동 가능하다.
switch day { // day라는 enum 변수 넣기
case .mon, .tue, .wed, thu :
print("월화수목입니다.")
case .fri, .sat :
print("금토입니다.")
dafault:
print("일요일입니다.")
} // 금토입니다.
enum Hero: Int {
case Ironman = 0
case Spiderman = 1
case Huik // 자동으로 2가 들어감
// 일시 증가기 때문에
}
print(Hero.Ironman.rawValue) // 0
print(Hero.spidernman.rawValue) // 1
print(Hero.Huik.rawValue) // 2
열거형 안에 함수를 넣을 수 있다.
enun Month {
case jan, fab, mar
case apr, mat, jun
case jul, aug, sep
case oct, nov, dec
func printMonth{
switch self {
case .jan, .feb, .mar:
print("1~3월")
case apr, mat, jun:
print("4~6월")
case jul, aug, sep:
print("7~9월")
case oct, nov, dec:
print("10~12월")
}
}
}
enum Idol {
case sungchan, wonbin, chanyoung
case doyoung, jaehyun, jungwoo
case wonyoung, yujin, rei
func idolTeamName() -> String{
switch self {
case .sungchan, .wonbin, .chanyoung:
return("라이즈")
case .dooyoung, .jaehyun, .jungwoo:
return("엔시티")
case .wonyoung, .yujin, .rei:
return("아이브")
}
}
}
let favoriteIdol = Idol.sungchan
print ("당신이 좋아하는 아이돌의 팀은 \(favoriteIdol.idolTeamName())입니다.")
먼저 'Idol'이라는 열거형을 정의한다. 열거형은 몇 가지 관련된 값을 그룹화하여 사용하는데 지금 난 다양한 아이돌 멤버들을 열거형 케이스로 정의하였다.
Idol 열거형에 'idolTeamName'이라는 메서드를 정의한다. 이 메서드는 각 아이돌 멤버에 해당하는 팀 이름을 문자열로 반환하는 것이다.
여기서 self는 현재 인스턴스이며, switch self문을 통해 현재 인스턴스의 값을 검사한다. 때문에 각케이스에 대해 해당하는 팀 이름을 반환할 것이다.
favoriteIdol라는 변수를 정의하여 열거형 속 특정 아이돌 멤버를 선택한다. 난 여기서 sungchan을 불러냈다.
선택한 아이돌의 팀 이름을 출력한다. idolTeamName() 메서드를 호출하여 팀 이름을 얻고 이를 문자열에 포함시켜 출력함
그리고... 클래스와 비슷하다고 했지만 사실 많이 다르긴 하다.
클래스는 상속이 가능하지만, 열거형은 불가능한데 왜냐하면 클래스는 참조형이고 열거형은 그냥 값 타입이기 때문이다.
더 복잡하게 나가자면 데이터가 저장되는 방식? 장소?도 다르고, 클래스 -객체 지향 프로그래밍 / 열거형 - 관련된 값의 집합을 표현으로 나뉜다는 점도 다르다.