Swift/Swift 기본문법

스위프트 기본문법 - 5. 세트(Set)

728x90

열거형

스위프트에서 열거형이라는 말이 무엇인지 가장 궁금했다. 그냥 반복 할 수 있게 나열 한건가? 알아보자

책에선 열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입입니다. 라고 적혀있다.

 

추가/ 수정이 불가능하고 딱 정해진 값만 열거형 값에 속할 수 있다고 한다.

미리 선언해 놓은 상수들의 집합인가?

 

열거형은 다음과 같은 경우 요긴하게 사용됩니다.

1) 제한된 선택지를 주고 싶을 때

2) 정해진 값 외에는 입력받고 싶지 않을 때

3) 예상된 입력 값이 한정되어 있을 때

 

예시를 보면 다음과 같습니다.

- 무선통신 방식 : WiFI, 블루투스, LTE, 3G, 기타

- 학생 : 초등학생, 중학생, 고등학생, 대학생, 대학원생, 기타

- 지역 : 강원도, 경기도, 경상도, 전라도, 제주도, 충청도

 

enum

열거형은 enum으로 선언 할 수 있습니다.

 

enum 열거형 선언

enum School {
    case primary            // 유치원
    case elementary         // 초등
    case middle             // 중등
    case high               // 고등
    case college            // 대학
    case university         // 대학교
    case graduage           // 대학원
}

 

enum 생성 및 변경

enum School {
    case primary            // 유치원
    case elementary         // 초등
    case middle             // 중등
    case high               // 고등
    case college            // 대학
    case university         // 대학교
    case graduage           // 대학원
}

var highestEducationLevel: School = School.university

// 위 코드와 정확히 같은 표현 입니다.
var highestEducationLevel2: School = .university


print(highestEducationLevel)    // university
print(highestEducationLevel2)    // university

// highestEducationLevel에 들어 갈 수 있는 값은 오직 School에 나열된 값 뿐입니다.

// 가능
highestEducationLevel = .graduage

// 불가능
// Cannot assign value of type 'String' to type 'School'
highestEducationLevel = "학교안가"

 

원시 값을 통한 열거형 초기화

enum Numbers: Int {
    case zero
    case one
    case two
    case ten = 10
}

// 자동으로 값을 할당해 줍니다.
print("\(Numbers.zero.rawValue), \(Numbers.ten.rawValue)")

let one = Numbers(rawValue: 1)          // Optional(__lldb_expr_941.Numbers.one)
let three = Numbers(rawValue: 3)        // nil

if let t = one {
    print(t)                            //one
}

 

연관 값 

enum에서 연관값 표현하기

 

enum내 case는 자신과 연관된 값을 가질 수 있습니다.

연관 값은 각 항목 옆에 소괄호로 묶어 표현 할 수 있습니다.

//// 여러 열거형의 응용
//
//enum MainDish {
//    case pasta(taste: String)
//    case pizza(dough: String, topping: String)
//    case chicken(withSauce: Bool)
//    case rice
//}
//
//var dinner: MainDish = MainDish.pasta(taste: "크림")  // 크림 파스타
//dinner = .pizza(dough: "치즈크러스트", topping: "불고기") // 불고기 치즈크러스트 피자
//
//
//dinner = .chicken(withSauce: true)                   // 양념 통닭
//dinner = .rice                                       // qkq
//

// 파스타와 피자의 도우, 토핑 등을 한정 지으려면 아래와 같이 하면 됩니다.
enum PastaTaste {
    case cream, tomato
}
enum PizzaDough {
    case cheeseCrust, thin, original
}
enum PizzaTopping {
    case pepperoni, cheese, bacon
}

enum MainDish {
    case pasta(taste: PastaTaste)
    case pizza(dough: PizzaDough, topping: PizzaTopping)
    case chicken(withSauce: Bool)
    case rice
}

var dinner: MainDish = .pasta(taste: PastaTaste.tomato)
dinner = MainDish.pizza(dough: PizzaDough.cheeseCrust, topping: PizzaTopping.bacon)

 

항목 순회 

CaseIterable 프로토콜을 통해 enum에 작성한 케이스 켈렉션을 받아 올 수 있습니다.

위에서 작성한 것 처럼 서로 연관된 enum이거나, Ios 플랫폼 별로 나열해야하는 enum이 다를 때는 enum 내부안에 allCases 를 선언해 직접적으로 만들어줘야합니다.

enum ProfileFilterOptions: Int, CaseIterable {
    case tweets
    case replies
    case likes
    
    var description: String{
        switch self {
        case .tweets: return "Tweets"
        case .replies: return "Tweets & Replies"
        case .likes: return "Likes"
        }
    }
}

 

CaseIterable을 사용하게 되면 배열의 기능 들을 사용 할 수 있습니다.

ProfileFilterOptions.allCases.count 와 같이 전체 갯수를 받아 올 수 도 있습니다.

 

저는 FilterView에서 정적인 Text를 관리할 때  enum과 switch 구문을 같이 사용한 적이 있는데 괜찮은 방법인 것 같습니다.

 

filterView enum case

 

 

 

 

반응형