열거형
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 |