Swift 열거형(2020.10.29)

K S Michael·2020년 10월 29일

swift TIL

목록 보기
8/29

정의

enum은 타입이므로 대문자 카멜케이스를 사용하여 이름을 정의합니다.
각 case는 소문자 카멜케이스로 정의합니다.
각 case는 그 자체가 고유의 값입니다.

enum 이름 {
case 이름1
case 이름2
case 이름3, 이름4, 이름5
}

사용

enum Weekday{
	case mon
    case tue
    case wed
    case thu, fri, sat, sun
    
    // 하나씩 혹은 여러개를 열거할수 있다.
}

var day: Weekday = Weekday.mon
day = .tue // day = Weekday.tue 의 축약형

print(day)

switch day {
	case .mon, .tue, .wed, .thu:
    	print("평일입니다")
    case .Weekday.fri:
    	print("불금 파티!!")
    case .sat, .sun:
    	print("신나는 주말!!")
        
        // day는 Weekday의 case에 걸리기 때문에 Weekday의 모든 케이스가 있다면 default 는 없어도 된다.
        // Weekday의 case 중에 하나라도 빠지게 되면 default 가 있어야 한다.
}

원시값

C 언어의 enum처럼 정수 값을 가질 수도 있다.
rawValue를 사용하면 된다.
case별로 각각 다른 값을 가져야 한다.

// 열거형을 기존의 C 언어 처럼 정수값을 가지게 만들고 싶다면 이름 뒤에 정수형타입인 Int를 추가한다.
enum Fruit: Int {
	case apple = 0 
    case grape = 1
    case peach     // case peach = 2 와 같이 정의하지 않아도 C 언어와 같이 자동으로 1씩 증가한 값이 할당된다.    
}

print ("Fruit.peach.rawValue == \(Fruit.peach.rawValue)")
// Fruit.peach.rawValue == 2

// 정수 타입 뿐만 아니라 Hashable 프로토콜을 따르는 모든 타입이 원시값의 타입으로 지정될수 있다.

enum School: String{
	case elementry = "초등"
    case middle = "중등"
    case high = "고등"
    case university
}
print ("School.middle.rawValue == \(School.middle.rawValue)")
// School.middle.rawValue == 중등

print ("School.university.rawValue == \(School.middle.rawValue)")
// School.university.rawValue == university
// Int는 1씩 증가한 값을 가져오지만 String은 case의 이름을 그대로 가지고 온다.

원시값을 통한 초기화

rawValue 를 통해 초기화 할 수 있다.
rawValue가 case에 해당하지 않을 수 있으므로 rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입이다.

let apple:Fruit = Fruit(rawValue: 3) // Fruit 안에 3이 없을 수 있기 때문에 옵셔널로 들어온다. 그래서 아래와 같이 타입을 옵셔널로 선언해서 optional binding으로 가지고 와야 한다.

let apple: Fruit? = Fruit(rawValue:3)

if let orange:Fruit = Fruit(rawValue:4) {
	print ("rawValue 4에 해당하는 케이스는 \(orange)입니다.")
} else {
	print("rawValue 5에 해당하는 케이스가 없습니다.")
} // rawValue 5에 해당하는 케이스가 없습니다.

메서드

열거형에 메서드도 추가할수 있다.

enum Month {
	case dec, jan, feb
    case mar, apr, may
    case jun, jul, aug
    case sep, oct, nov
    
    func printMessage(){
    	switch self {
        	case .mar, .apr, .may:
            	print("따스한 봄~")
            case .jun, .jul, .aug:
            	print("여름은 더워요~")
            case .sep, .oct, .nov:
            	print("가을은 독서의 계절!")
            case .dec, .jan, .feb
            	print("추운 겨울입니다.")
        }
    }
}

Month.mar.printMessage() // Month의 mar는 어떤계절이고 printMessage메서드는 어떠한 메세지를 던지느냐?? 라는 뜻을 가진 메서드

Swift 열거형에 다른 언어의 열거형을 끼워 맞추려 하면 학습하기 어려워질수도 있다.

출처 : 유튜브 "yagom"

profile
차근차근

0개의 댓글