본문 바로가기

스위프트(Swift)

스위프트(Swift) - 열거형(enum)

반응형

스위프트 데이터 타입 열거형

스위프트에서 열거형은 같은 부류에 속하는 요소들을 묶어서 표현할 수 있는 타입입니다. 다른 타입들과 다르게 한번 선언한 이후에는 추가하거나 수정이 불가합니다. 그래서 보통 정해진 범위 내의 값들을 다룰 때 많이 사용합니다.

 

1. 열거형의 선언 방법

enum Animal  // 열거형 키워드 enum을 사용해 Animal이라는 이름의 열거형을 선언합니다.
{
    case dog  // dog, cat, lion ,tiger는 Animal 열거형의 항목입니다.
    case cat   // 각 항목은 그 자체로 모두 고유한 값을 지닙니다.
    case lion
    case tiger
}

// 다음과 같은 형태로 열거형을 선언할 수 있습니다.
enum Animal { case dog, cat, lion, tiger }

 

2. 열거형의 변수 생성 및 값 수정

var animal: Animal = Animal.dog 
// 열거형 변수 animal의 값을 항목 dog로 초기화

var animal2: Animal = Animal
// animal2를 Animal의 열거형으로 선언

animal2 = Animal.cat
 
// animal2를 cat으로 초기화

animal = .lion
// 열거형의 속해있는 항목 lion으로 수정

print(animal)
// lion 출력. -> 열거형의 항목은 그 자체로 타입이기 때문에 Int, String 등을 지정하지 않아도 된다.

 

3. 열거형의 원시 값 지정

enum Animal: String // 열거형의 원시 값을 String 타입으로 지정하여 선언할 수 있습니다.
{ 
    case dog = "강아지"   // 열거형의 각 항목의 값을 String 타입으로 지정
    case cat = " 고양이"
    case lion = "사자"
    case tiger
}

var animal: Animal = Animal.dog
print(animal.rawValue) // 강아지 출력

animal = .tiger // animal 값 변경
print(animal.rawValue)
// tiger 출력, 원시 값을 지정하지 않은 항목은 그 자체를 출력합니다.

enum Number: Int
{ 
    case one= 1  // 열거형의 각 항목의 값을 Int 타입으로 지정
    case two = 2
    case three
}
var number: Number = .three
print(number.rawValue)
// 숫자 3 출력
// three의 원시 값이 정의되어 있지 않지만, 스위프트에서 추측해서 값을 대신 정의하기도 합니다.

 

4. 열거형의 원시 값을 이용한 초기화

var animal = var animal = Animal(rawValue:"강아지")
// 열거형 원시 값을 통한 초기화

print(Animal(rawValue:"강아지"))
// Optional(SwiftPlayground.Animal.dog)를 출력한다. //즉 위의 열거형 변수를 초기화할 수 있는 값이다.

 

5. 열거형의 연관 값 지정

enum Apple  

    case iPhone(iOS: Double) 
    case iPad(iPadOS: Double) 
    case airPod(grade: String) 
    case waTch(type: String) 
}
// 열거형 타입으로 회사 Apple과 연관된 제품들을 표시할 수 있습니다.

var myAppleThings: Apple
myAppleThings = .iPhone(iOS: 13.1)
myAppleThings = .iPad(iPadOS: 13.2)
// 내가 가진 Apple 아이폰과 아이패드의 버전을 할당합니다.

myAppleThings = .airPod(grade: "airPod pro")
myAppleThings = .waTch(type: "HERMES")
// 내가 가진 Apple 에어팟과 와치의 형태를 할당합니다.


enum iPhoneVersion
{ case iOS12, iOS13, iOS14 }
// 아이폰 버전을 나타내는 열거형을 선언합니다.

enum macBookType
{ case Air, Pro }
// 맥북의 버전을 나타내는 열거형을 선언합니다.

enum Apple
{
     case iPhone(version: iPhoneVersion) // 연관 값을 이전에 선언한 열거형으로 사용할 수 있습니다.
     case macBook(type: macBookType)
}
// 애플의 제품을 표현하는 열거형을 선언합니다.

var myiPhone: iPhoneVersion = .iOS13 
var myMacbook: macBookType = .Pro
// 열거형 변수를 선언하며, 초기값을 선언합니다.

var myAppleThings: Apple = Apple.iPhone(version:myiPhone) 
myAppleThings = Apple.macBook(type: myMacbook)
// 열거형 변수를 선언하며, 이전에 사용한 열거형 변수를 초기값으로 선언합니다.

 

5. 열거형의 항목 순회

enum animal: CaseIterable // 'CaseIterable' 를 사용하면 모든 case를 반환할 수 있는 allCases 프로퍼티 사용이 가능합니다.
enum animal: String, CaseIterable // 열거형이 원시 값을 갖는다면 ','를 사용해서 구분해줍니다.
{
    case cat
    case dog
    case lion
    case tiger
}
let all: [animal] = animal.allCases // 배열 타입의 객체를 반환합니다.

print(all) // 모든 case 항목을 출력합니다.

// 그러나 'CaseIterable'를 사용하더라도 'allCases'를 사용하지 못하는 경우가 2가지 있습니다. 먼저 '열거형 내 available 속성을 통해 특정 케이스를 플랫폼에 따라 사용여부를 결정한다면 사용하지 못하고, 직접 구현해주어야 합니다.

// 추가적으로 열거형이 연관 값을 가질 때 입니다. 역시 마찬가지로 직접 구현해주어야 합니다. 여기서는 다루지 않으니, 추후에 추가하거나, 다른 글로 작성해보겠습니다.

 

6. 순환 열거형

저도 공부하는 입장에서 조금 어려운데요. 순환 열거형은 열거형 항목의 연관 값이 열거형 자신의 값(자기 자신을 가리키는)으로 지정하려고 할 때 사용합니다. 이때 키워드는 indirect를 사용합니다.

indirect enum calculation // 맨 앞에 indirect는 전체 열거형 각각의 항목에 순환 열거형을 지정합니다.
{
    case number(Int)  // 특정 항목 앞에 indirect를 명시하면 해당 항목만 순환 열거형임을 지정합니다.
    case add(calculation, calculation)
    case sub(calculation, calculation)
}

func evaluate(_ expression: calculation) -> Int // 'calculation' 열거형을 기준으로 생성한 Int를 리턴하는 함수
{
    switch expression 
    {
        case .number(let value):
            return value
        case .add(let l, let r):
            return evaluate(l) + evaluate(r) // evaluate안의 evaluate는 자신을 또 호출하는 형식입니다.
         case .sub(let l, let r):
            return evaluate(l) - evaluate(r)
    }
}
let one = calculation.number(1)
// 숫자 1을 넣은 'calculation' 열거형을 생성합니다.
let two = calculation.number(2)
// 숫자 2를 넣은 'calculation' 열거형을 생성합니다.
let add= calculation.add(one, two)
// 위에서 생성한 열거형 2개를 인자로 넣은 열거형을 생성합니다.
let result = evaluate(add) //
해당 함수를 실행 후 결과 값을 반환합니다.
print(result) // 3

추후 연구를 하면서 내용이 변경되거나, 수정할 사항이 생기면 업데이트 예정입니다.

반응형