320x100
728x90

 

열거형 구문 

  • enum 키워드 사용하여 중괄호 안에 모든 정의를 함 
  • case 키워드를 사용하여 열거형 나열 

 

 

 

1️⃣ 열거형 선언

 

enum CompassPoint {
    case north
    case south
    case east
    case west
}

 

 

🔎 값 할당 및 접근 

 

CompassPoint 이름을 통해 한번 값을 할당하면, 그 이후에는 이름을 생략해도 된다. 

var direction = CompassPoint.west
direction = .east

 

 


 

 

 2️⃣ switch 구문 사용

 

열거형 케이스에 대하여 switch 구문을 사용할 때, 모든 케이스에 대하여 조건이 명시되어 있어야 한다. 

direction = .south
switch direction = {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
}

//에러 발생

 

east와 west에 대한 케이스가 명시되어 있지 않으므로 컴파일 오류가 발생함. 

 

 

다 명시하는 것이 비효율적인 경우 default 케이스로 처리 

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
    print("Mostly harmless")
default:
    print("Not a safe place for humans")
}
// Prints "Mostly harmless"

 

 


 

 

3️⃣ 열거형 Iterable 

 

열거형의 모든 케이스를 수집하려고 할 때, enum 뒤에 : CaseIterable을 작성한다. 

CaseIterable은 allCases 프로퍼티를 통해 모든 케이스에 대한 정보를 수집한다. 

enum Beverage: CaseIterable {
    case coffee, tea, juice
}
let totalCount = Beverage.allCases.count
print("\(totalCount) 가능 음료")
// 3 가능 음료

 

 

🔎 반복문에서의 활용

for beverage in Beverage.allCases {
    print(beverage)
}
// coffee
// tea
// juice

 

 


 

4️⃣ 열거형 연관된 값 저장하기

 

UPC 바코드와 큐알 코드 바코드를 저장하는 Barcode 열거형

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

 

 

🔎 값 할당

var productBarcode = Barcode.upc(8, 83120, 45321, 3)

 

productBarcode에 qrCode 값 또한 할당할 수 있다.

productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

 

 


 

5️⃣ 원시값(Raw Values) 저장

 

모두 동일한 타입의 값으로 채우고 싶다면 다음과 같이 enum 변수 옆에 타입을 설정한다.

enum ASCIIChar: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

 

 

🔎 원시값의 암시적 할당

원시값이 저장된 열거형은 자동적으로 값이 할당된다. 

 

 

 

정수 원시값인 경우 

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

// 이 때, 첫번째 케이스 값 설정 안하면 초기값은 0임.
Planet.mercury의 값은 1
Planet.venus 는 자동으로 2가 됨

그 이후는 3,4,5 ...

 

 

 문자열 원시값 경우 

enum CompassPoint: String {
    case north, south, east, west
}

문자열은 문자 그대로의 값을 원시값으로 가진다. 

 

 

 

rawValue를 사용하여 원시값에 접근할 수도 있다.  

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"

 

혹은 rawValue를 활용한 값 할당

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet 에 7번째 값인 Planet.uranus 할당

 

 


 

6️⃣ 재귀 열거형 

 

열거형 케이스로 열거형 안에서 다른 인스턴스를 열거형으로 가지고 있는 것을 말한다. 

아래 예시를 보면, recursiveEnum에서 addtion의 케이스로 recursiveEnum의 인스턴스 중 number를 

열거형으로 갖고 있다. 

 

 

재귀 열거형을 사용하려면 indirect 키워드를 함께 써주면 된다. 

enum recursiveEnum {
    case number(Int)
    indirect case addition(recursiveEnum, recursiveEnum)
    indirect case multiplication(recursiveEnum, recursiveEnum)
}

 

let five = recursiveEnum.number(5)
let four = recursiveEnum.number(4)

// 재귀 열거형
let sum = recursiveEnum.addition(five, four)
let product = recursiveEnum.multiplication(sum, recursiveEnum.number(2))

 

 

전체를 모두 재귀 열거형으로 만들고 싶을 때 -> enum 시작 전indirect 작성 

indirect enum recursiveEnum {
    case number(Int)
    indirect case addition(recursiveEnum, recursiveEnum)
    indirect case multiplication(recursiveEnum, recursiveEnum)
}

 

 

이를 활용한 재귀 함수 

func evaluate(_ expression: recursiveEnum) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}

print(evaluate(product))
// Prints "18"

 

 

 

 

출처 : https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations

728x90
반응형