k-coding

Swift 열거형 ( enum ) 본문

iOS/Swift 정리

Swift 열거형 ( enum )

chkhn_oiiu 2021. 10. 11. 17:06

Swift 열거형 ( enum )

 

열거형이란 같은 주제로 연관된 데이터들을 멤버로 구성하여 나타내는 자료형 이다.

 

 

enum의 기본 구조는 다음과 같다.

enum EnumName {
	case name1
	case name2
	case name3, name4, name5
	// ...
}

 

이렇게 case별로 정리한 열거형이 하나의 자료형이 된다.

 

 

 

Raw Value

 

raw value 한국어로 원시값이라는 이것은 enum내부에 독립적인 값을 저장하는것이다.

 

 

< Int >

enum EnumName: Int {
    case name1 = 1   //  1
    case name2       //  2
    case name3 = 10  //  10
    case name4       //  11
    case name5       //  12
}

enum의 타입이 int이면 첫번째 case인 name1부터 1씩 증가된 값이 들어간다.

 

이때, name1에 값을 따로 지정해주지 않으면 0부터 시작한다.

 

case에 특정 값이 지정되었다면 다음 case는 이전 case의 값에서 +1을 한 값이 지정된다.

 

 

< Double, Float >

enum EnumName: Double {
    case name1 = 1.0   //  1.0
    case name2 = 2.0   //  2.0
    case name3 = 3.0   //  3.0
    case name4 = 4.0   //  4.0
    case name5         //  error
}

enum의 타입이 실수형으로 지정할 것 이라면 모든 case에 값을 다 부여해 주어야한다.

 

원시값은 이전case에서 +1을 한값을 현 case에 부여하는데 정수 + 실수라는 타입 에러가 발생하기 때문이다.

 

 

혹시 그래도 다 붙이기 귀찮다면

enum EnumName: Double {
    case name1 = 1.0   //  1.0
    case name2 = 2.0   //  2.0
    case name3 = 3.0   //  3.0
    case name4 = 4     //  4.0
    case name5         //  5.0
}

다음과 같이 지정해주는 마지막 case를 Int형으로 선언하면 된다.

 

 

 

< Character >

enum EnumName: Character {
    case name1 = "a"        //a
    case name2 = "b"        //b
    case name3 = "c"        //c
    case name4 = "d"        //d
    case name5 = "e"        //e      
}

enum의 타입이 character일 경우에는 하나도 빠짐없이 모든 case에 대한 원시값을 선언해주어야합니다.

 

 

< String >

enum EnumName: Character {
    case name1 = "first"     // first
    case name2               // name2
    case name3 = "third"     // third
    case name4               // name4
    case name5               // name5
}

enum 타입이 string인 경우는 원시 값을 지정 안해주면 case의 이름과 동일한 원시 값이 자동으로 배정된다.

 

 

 

열거형 호출

enum EnumName: Character {
    case name1 = "first"     // first
    case name2               // name2
    case name3 = "third"     // third
    case name4               // name4
    case name5               // name5
}

var player1: EnumName = .name1         // name1
var player2: EnumName = .name2         // name2

player1.rawValue   //  first
player2.rawValue   //  name2

 

 

원시값을 이용해 초기화

 

원시값을 통하여 초기화를 할 수 있다.

 

물론 원시값이 없는 case가 있을 수 있으모로, 기본적으로 옵셔널 타입이어야 한다.

enum EnumName: Character {
    case name1 = "first"     // first
    case name2               // name2
    case name3 = "third"     // third
    case name4               // name4
    case name5               // name5
}

let player1: EnumName? = EnumName(rawValue :"first")

if let player2:  EnumName? = EnumName(rawValue :"third") {
	// ...
    } else {     // "third"라는 rawValue가 없을 때 즉, 값이 nil일 때
    // ...

 

 

열거형과 메소드

 

enum( 열거형 ) 안에 메소드를 같이 넣을수 있다.

enum EnumName: Character {
    case name1 = "first"     // first
    case name2               // name2
    case name3 = "third"     // third
    case name4               // name4
    case name5               // name5
    
    func enumFunc() {
    	switch self{
            //...
        }
    }
}

EnumName.name1.enumFunc()

'iOS > Swift 정리' 카테고리의 다른 글

Swift 프로토콜  (0) 2021.10.15
Swift 확장 ( extension )  (0) 2021.10.15
Swift Optional ( 3 )  (0) 2021.10.10
Swift Optional ( 2 )  (0) 2021.10.10
Swift 함수 사용  (0) 2021.10.07
Comments