iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - 열거형(enum)

wse46 2024. 11. 17. 23:11
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (34:04 ~ 35:40)

 

 

# 열거형(enum)

 

관련있는 데이터들이 멤버로 구성되어 있는 자료형

  • 원치 않는 값이 잘못 입력되는 것 방지
  • 입력 받을 값이 한정되어 있을 때
  • 특정 값 중 하나만 선택하게 할 때

  • 색깔 : 빨강, 녹색, 파랑 / 성별 : 남, 여

 

열거형 정의

enum 열거형명{
   열거형 정의
}
enum Planet {
   case Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune
}  // 하나의 case문에 멤버들 나열하는 것도 가능
enum Compass {
   case North
   case South
   case East
   case West
}
  • // var x : Compass // Compass형 인스턴스 x
  • print(Compass.North) // North
  • var x = Compass.West //print(type(of:x)) // Compass?
  • x =  .East // print(x) // East?
    문맥에서 타입의 추록이 가능한 시점 (등호 좌변의 변수 타입이 확정적일 때)에는 열거형명 생략 가능

 

열거형 멤버별 기능 정의

enum Compass {
   case North
   case South
   case East
   case West
}
var direction : Compass
direction = .South
switch direction { //swith의 비교값이 열거형 Compass
case .North: // direction이 .North이면 "북" 출력
   print("북")
case .South:
   print("남")
case .East:
   print("동")
case .West:
   print("서") // 모든 열거형 case를 포함하면 default 없어도 됨
}

 

 

Swift 열거형 멤버에는 메서드도 가능

enum Week: String {
   case Mon, Tue, Wed, Thur, Fri, Sat, Sun
   func printWeek() { // 메서드도 가능
      switch self {
      case .Mon, .Tue, .Wed, .Thur, .Fri:
         print("주중")
      case .Sat, .Sun :
         print("주말")
      }
   }
}
Week.Sun.printWeek()
  • 출력값
    주말

 

열거형의 rawValue

enum Color: Int { //Hashable 프로토콜을 준수하는 기본 자료형
   case red = 0
   case green
   case blue
}
print(Color.red)
print(Color.blue)
print(Color.red.rawValue)
print(Color.blue.rawValue)
  • 출력값
    red0
    2
    blue

 

String형 값을 갖는 열거형의 rawValue

enum Week: String {
   case Monday = "월"
   case Tuesday = "화"
   case Wednesday = "수"
   case Thurday = "목"
   case Friday = "금"
   case Saturday // 값이 지정되지 않으면 case 이름이 할당됨
   case Sunday
}
print(Week.Monday)
print(Week.Monday.rawValue)
print(Week.Sunday)
print(Week.Sunday.rawValue)
  • 출력값
    Monday
    Sunday
    Sunday

 

연관값(associated value)을 갖는 Enum

enum Date {
   case intDate(Int,Int,Int) // (int,Int,Int)형 연관값을 갖는 intDate
   case stringDate(String) // String형 연관값을 갖는 stringDate
}
var todayDate = Date.intDate(2020,4,30)
todayDate = Date.stringDate("2020년 5월 20일")
switch todayDate {
   case .intDate(let year, let month, let day):
      print("\(year)년 \(month)월 \(day)일")
   case .stringDate(let date):
      print(date)
   }
  • 출력값
    2020년 5월 20일

 

옵셔널은 연관값(associated value)을 갖는 enum

let age: Int? = 30

switch age {
case .none: //nil인 경우
   print("나이 정보가 없습니다.")
case .some(let a) where a < 20:
   print("미성년자입니다.")
case .some(let a) where a < 71:
   print("성인입니다.")
default:
   print("경로우대입니다")
}
  • 출력값
    성인입니다