본문 바로가기
Swift/기본

열거형

by 밤새는탐험가 2024. 4. 2.

열거형

 

1. enum은 타입, 대문자 카멜케이스를 사용하여 이름을 정의한다.

2. 각 case는 소문자 카멜케이스로 정의한다. 

3. 각 case는 그 자체가 고유의 값이다. 

4. 각 케이스는 한 줄에 개별로도, 한 줄에 여러 개도 정의할 수 있다. 

 

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

 

 

열거형 사용

enum FruitInfo {
    case apple
    case banana
    case kiwi
    case melon, strawberry, orange
}

// 열거형 타입과 케이스를 모두 사용된다.
var apple: FruitInfo = FruitInfo.apple
print(apple)    // apple

 

 

 switch의 비교값에 열거형 타입이 위치할 때

 모든 열거형 케이스를 포함한다면

 default를 작성할 필요 없다.

 

var myFruit: FruitInfo = .banana

switch myFruit {
case .apple, .banana, .kiwi:
    print("내가 좋아하는 과일은 사과, 바나나, 키위이다.")
case FruitInfo.melon:
    print("내가 좋아하는 과일은 멜론, 딸기이다. ")
case .strawberry,.orange:
    print("내가 좋아하는 과일은 오렌지이다.")
}

// 내가 좋아하는 과일은 사과, 바나나, 키위이다.

 

 

 

원시값

rawValue을 사용한다. 

case 별로 각각 다른 값을 가져야 한다. 

 

enum FruitInfo: Int {
    case apple = 2500
    case banana = 1500
    case kiwi = 4500
    case melon
    
    /*
     만약에 orange도 apple과 같이 2500이면
     orange 케이스의 원시값을 2500 줄 수 없다.
     */
    // case orange = 2500
}

print("FruitInfo.apple.rawValue == \(FruitInfo.apple.rawValue)")
// FruitInfo.apple.rawValue == 2500


// 만약에 rawValue을 지정하지 않는 melon을 출력하면
// 이전 케이스 kiwi의 rawValue 4500 이어지는 4501로 나온다.
print("FruitInfo.melon.rawValue == \(FruitInfo.melon.rawValue)")
// FruitInfo.melon.rawValue == 4501

 

 

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

 

enum FruitInfo: String {
    case apple = "맛있는 청송사과"
    case banana = "달디단 바나나"
    case melon = "멜론은 역시 메로나"
    case kiwi
}

print("FruitInfo.apple.rawValue == \(FruitInfo.apple.rawValue)")
// FruitInfo.apple.rawValue == 맛있는 청송사과


/*
 rawValue가 없는 kiwi를 출력하면
 case 값이 나온다. 
 */
print("FruitInfo.kiwi.rawValue == \(FruitInfo.kiwi.rawValue)")
// FruitInfo.kiwi.rawValue == kiwi

 

 

원시값을 통한 초기화

rawValue를 통해 초기화를 할 수 있다. 

 

rawValue가 case에 해당하지 않을 수 있으므로 

rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입이다. 

enum FruitInfo: Int {
    case apple = 2500
    case banana = 1500
    case kiwi = 4500
    case melon

}

var apple: FruitInfo? = FruitInfo(rawValue: 1000)

 

rawValue를 통해 초기화 한 열거형 값은 옵셔널 타입이다.

(FruitInfo 타입이 아니다.)

 

if let 구문을 사용하면 rawValue에 해당하는 케이스를 곧바로 사용할 수 있다.

 

if let banana: FruitInfo = FruitInfo(rawValue: 0) {
    print("rawValue 1500에 해당하는 케이스는 \(banana)")
} else {
    print("rawValue 0에 해당하는 케이스는 없다.")
}
// rawValue 0에 해당하는 케이스는 없다.

 

 

메서드

스위프트의 열거형에는 메서드도 추가할 수 있다. 

enum FruitColor {
    case apple, strawberry
    case banana, mango
    case melon, kiwi
    
    
    func printFruitColor() {
        switch self {
        case .apple, .strawberry:
            print("빨간색")
        case .banana, .mango:
            print("노란색")
        case .melon, .kiwi:
            print("초록색")
        }
    }
}

FruitColor.apple.printFruitColor()   // 빨간색

 

 

enum MyColor: Int64 {
    case red    = 1
    case green  = 2
    case blue   = 3
    case purple = 4
    
    var backgoundColor: UIColor {
        switch self {
        case .red:
            //UIColor(hexString: "#EFD9D4")
            return UIColor(red: 239/255, green: 217/255, blue: 212/255, alpha: 1)
        case .green:
            //UIColor(hexString: "#C2EDEA")
            return UIColor(red: 194/255, green: 237/255, blue: 234/255, alpha: 1)
        case .blue:
            //UIColor(hexString: "#C4E4F2")
            return UIColor(red: 196/255, green: 228/255, blue: 242/255, alpha: 1)
        case .purple:
            //UIColor(hexString: "#D4D4F5")
            return UIColor(red: 212/255, green: 212/255, blue: 245/255, alpha: 1)
        }
    }
    
    var buttonColor: UIColor {
        switch self {
        case .red:
            return UIColor(red: 232/255, green: 163/255, blue: 153/255, alpha: 1)
        case .green:
            return UIColor(red: 89/255, green: 190/255, blue: 183/255, alpha: 1)
        case .blue:
            return UIColor(red: 88/255, green: 181/255, blue: 236/255, alpha: 1)
        case .purple:
            return UIColor(red: 118/255, green: 103/255, blue: 228/255, alpha: 1)
        }
    }
    
}

 

 

'Swift > 기본' 카테고리의 다른 글

프로퍼티  (0) 2024.04.03
Class vs Struct / Enum  (0) 2024.04.03
클래스 (Class)  (0) 2024.04.01
구조체 (Struct)  (0) 2024.04.01
옵셔널  (0) 2024.03.29