enum TypeName {
case caseName
case caseName, caseName
}
여기서 조심해야될 점은 case도 하나의 값이다!("left"/ 1 과 같이 정수 값이나 string 값과 같이 그냥 값이다!)
예)
enum Alignment {
case left
case right
case center
}
Alignment.center
Alignment.left
Alignment.right
var textAlignment = Alignment.center
// 열거형 이름은 생략하고 case이름만 작성해도 된다!
textAlignment = .left
switch textAlignment {
case .left:
print("left")
case .right:
print("right")
case .center:
print("center")
}
열거형의 case 는 모두 독립적인 값이지만 내부에 또 다른 값을 저장할 수 있습니다. 이것을 원시값(raw value)이라고 합니다.
-> 원시값을 만약 가지고 싶다면, enum 선언 시 이름 옆에 Type을 꼭 써줘야된다.
enum Name: RawValueType {
case caseName = value
}
예)
enum Alignment: Int {
case left
case right
case center
}
Alignment.left.rawValue //0
Alignment.right.rawValue //1
Alignment.center.rawValue //2
enum Alignment: Int {
case left
case right = 10
case center
}
Alignment.left.rawValue //0
Alignment.right.rawValue //10
Alignment.center.rawValue //11
Alignment(rawValue: 0) //left
Alignment(rawValue: 10) //right
enum WeekDay: String {
case sunday
case monday
case tuesday
case wednesday
case thursday
case friday
case saturday
}
WeekDay.sunday.rawValue //sunday
enum WeekDay: String {
case sunday
case monday = "MON"
case tuesday
case wednesday
case thursday
case friday
case saturday
}
WeekDay.monday.rawValue // "MON"
enum ControlChar: Character {
case tab = "\t"
case newLine = "\n"
}
단, 모든 케이스가 동일한 형식을 가져야된다.
기본 꼴
enum Name {
case caseName(Type)
case caseName(Type, Type, ...)
}
또한, 연관값의 경우에는 선언 시점이 아닌 새로운 열거형을 생성할 때 값을 저장한다.
예를 들어서 아래와 같이 연관값을 설정할 수 있다.
enum AppleDevice {
case iPhone(model: String, storage: Int) // named tuple
case iMac(size: Int, model: String, price: Int)
case macBook(String, Int, Int) // unnamed tuple
}
그리고 아래는 연관값을 확인한 후에 코드를 실행할 때 switch문을 사용한 케이스다.
var gift = AppleDevice.iPhone(model: "X", storage: 256)
switch gift {
case .iPhone(model: "X", storage: 256):
print("iPhone X and 256GB")
case .iPhone(model: "X", _)
// 와일드카드 패턴 사용 가능
print("iPhone X")
case .iPhone:
// 연관값 생략 가능
print("iPhone")
case .iPhone(let model, let storage):
// 블록 내부에서 연관값을 사용할 땐 상수로 바인딩
// 값을 변경할 때는 var 로 변경가능
print("iPhone \(model) and \(storage)GB")
case let .iMac(size, model, price):
// 모든 연관값을 동일한 형태로 바인딩한다면
// let 키워드를 열거형 케이스 앞에 표기하는 것도 가능
print("iMac \(size), \(model), \(price)")
}
사용 예)
enum Animal: CaseIterable {
case rabbit
case dog
case cat
}
print(Animal.allCases) // enum case들을 배열 안에 넣어서 return한다.
Animal.allCases.forEach({ Animal in
print("\(Animal)")
}) // rabbit dog cat
프로젝트를 하다가 유용하게 사용한 enum문법이다. enum 안에 연산 property를 사용한 경우이다.
enum FruitJuice: Int, CaseIterable {
case strawberryBanana = 1
case strawberry = 2
case banana = 3
case pineapple = 4
case mangoKiwi = 5
case kiwi = 6
case mango = 7
var recipe: [Fruit: Int] {
switch self {
case .strawberryBanana:
return [Fruit.strawberry: 10, Fruit.banana: 1]
case .strawberry:
return [Fruit.strawberry: 16]
case .banana:
return [Fruit.banana: 2]
case .pineapple:
return [Fruit.pineapple: 2]
case .mangoKiwi:
return [Fruit.mango: 2, Fruit.kiwi: 1]
case .kiwi:
return [Fruit.kiwi: 3]
case .mango:
return [Fruit.mango: 3]
}
}
}
FruitJuice.mango.recipe // [mango: 3]
enum FruitJuice: Int, CaseIterable {
case strawberryBanana = 1
case strawberry = 2
case banana = 3
case pineapple = 4
case mangoKiwi = 5
case kiwi = 6
case mango = 7
func juiceType() -> String {
switch self {
case .strawberryBanana:
return "strawberryBanana"
case .strawberry:
return "strawberry"
...
}
}
FruitJuice.mango.juiceType() // "mango"
enum ExpressionParser {
static func parse(from input: String) -> Formula {
...
return Formula(operandsList: operandsList, operatorsList: operatorsList)
}
private static func componentsByOperators(from input: String) -> [String] {
return input.split(with: ",")
}
}
// 사용부
let sut = ExpressionParser.parse(from: inputString)