Dev/Swift

Swift: 열거형(Enum)

두넌 2023. 5. 14.

DAY 04

Enum (열거형) 표현하기

 

Enum


Enumeration(열거형) 라는 뜻을 가진 Enum은 관련 있는 데이터들이 멤버로 구성되어 있는 자료형 객체

 

Enum 왜 사용하는가?


원치 않는 값이 잘못 입력되는 것 방지

입력 받을 값이 한정되어 있을 때

특정 값 중 하나만 선택하게 할 때

 

사용법


enum School {
    case elementary
    case middle
    case high
    // case elementary, middle, high
}
let yourSchool = School.elementary
print("yourSchool : \(yourSchool)")

output

 yourSchool : elementary

 

Enum 변수의 Data type


yourSchool 변수 타입은 School 타입이다.

print(type(of:yourSchool))

output

School

 

문맥에서 타입의 추론이 가능한 시점에는 열거형 명 생략 가능


var x = School.elementary
x = .high
print(x)

output

high

아래와 같은 형식으로도 표현 가능

var sc : School
sc = .elementary

이러면 어떤 형식으로도 응용이 가능하냐면

switch sc {
    case .elementary:
        print("you are elementary school student")
    case .middle
        print("you are middle school student")
    case .high
        print("you are high school student")
}

 

Enum의 rawValue


enum Count : Int {
    case a
    case b = 3
    case c
}

a  rawValue 는 0이고, b는 3이다

c의 rawValue 는 4가 된다

enum School : String {
    case elementary = "초등학교"
    case middle = "중학교"
    case high
}

print(School.elementary)
print(School.high)

output

초등학교
high

Value를 지정하지 않은 경우 case이름이 할당됨

 

Enum의 Associated Value


enum Birth {
    case intBirth(int, int, int)
    case stringBirth(String)
}
var myBirth = Birth.intBirth(1999,12,30)
myBirth = Birth.stringBirth("1999년 12월 30일")

switch myBirth {
    case .intBirth(let year, let month, let day):
        print("\(year)년 \(month)월 \(day)일")
    case .stringBirth(let str):
        print(str)
}

output

1999년 12월 30일

switch-case 의 두번째 .stringBirth 에서 print(str) 에 따라 출력되었음

 

Optional 에서의 Enum


Optional 이란 변수에 값이 들어있을 수도 있고, 없을 수도 있다(nil)는 표현

? 라는 특수문자로 표현한다

public enum Optional<Wrapped> {
    case none
    case some(Wrapped)
}

다음과 같이 Optional method는 swift 내에 정의되어 있다

let value : Int? = nil

switch value {
case .none:
    print("정보가 없습니다")
case .some(let a) where a % 2 == 0:
    print("\(a) 는 짝수 입니다.")
case .some(let a) where a % 2 == 1:
    print("\(a) 는 홀수 입니다.")
default:
    print("default는 한정적인 값(열거형 등)이 아니면 반드시 작성해야 함")
}

Swift에서 기본 자료형을 nil로 초기화할 수 없다

let value : Int = nil   // cannot initialize
nil cannot initialize specified type 'Int'

만약 실행시킨다면, 다음과 같은 오류를 발생시킨다

따라서 변수에 들어있는 값을 안전하게 꺼내 사용하기 위하여 Optional을 사용한다.

그리고 위와 같이 Optional은 Enum의 한 종류로 정의되어 있음

 

Reference


https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html

댓글