Swift enum class

최준영·2022년 7월 10일
1

Swift

목록 보기
4/6
post-custom-banner

Basic knowledge

  • 한번 선언한 열거형의 항목은 추가 및 수정이 불가능하다.
  • 선언한 열거형은 고유의 타입으로 인식된다.

기본형

enum Food {
    case spagetti
    case hamburger
    case coke
    case cake, pizza, susi //연속적인 항목선언 가능
}

let b: Food = Food.spagetti
let a: Food = .spagetti //타입이 지정됬다면 열거형 이름은 생략이 가능하다.

print(a, b) //spagetti spagetti

아래코드에 주목해보자

let a: Food = .spagetti

a변수에 타입을 Food라고 지정해주면 .spagetti를 부여할 때 Food 생략 가능한 것을 알 수 있다.
주의해야할 점은 .spagetti앞에는 반드시 공백이 존재해야한다는 점이다.
공백을 지정하지 않으면 오류가 발생한다
추가적으로 swift의 = 대입연산자는 양옆항이 같은 공백영역을 가져야 한다.

//오류가 발생하는 경우
let a: Food= .spagetti
let a: Food =.spagetti
let a: Food=.spagetti

//올바른경우
let a: Food = .spagetti

원시값을 가지는 열거형

enum Food2: String {
    case pizza="bread"
    case hamburger="meal"
    case chicken="animal",soda="juice"
    case steak //지정값은 선택사항이다.
}

let meal = Food2.pizza;
print(meal.rawValue); //bread

지정값이 없는 경우

//지정값 타입이 String인 경우는 각항목의 이름이 지정값이 된다.
print (Food2.steak.rawValue); //steak 

//타입이 Int의 경우 앞의 항목부터 0부터 오름차순으로 자동 지정된다.
enum TestInt: Int{
    case zero
    case one
    case two
}

print(TestInt.zero.rawValue, TestInt.one.rawValue, TestInt.two.rawValue) //0 1 2

지정값을 사용해 항목 찾기

//옵셔널 바인딩 사용
if let bind = Food2(rawValue: "bread"){
    print(bind) //pizza
}
else {
    print("해당하는 원시값을 가진 항목이 없습니다.")
}

연관값을 가지는 열거형

위의 지정값과 다르게 항목마다 다른 타입의 값을 가질수 있다.

enum Date {
    case birthday(year: Int, month: Int, date: Int) //튜플형
    case birth_year(Int) //이름을 명시하지 않아도 된다
}

let myDay:Date = .birthday(year: 2002, month: 4, date: 32)
let myYear:Date = .birth_year(2002);

print(myDay) //birthday(year: 2002, month: 4, date: 32)
print(myYear) //birth_year(2002)

연관값의 활용

Switch

🔍Swift Switch포스팅

enum Cooking {
    case rare, medium, wellDone
}
enum Sauce {
    case ketchap, mustard, redWine
}
enum Food {
    case steak(_ level: Cooking, _ sauce: Sauce, _ animal: String)
}

func steakOlder(_ data: Food){
    switch(data){
        case .steak(Cooking.medium, Sauce.mustard, "Beaf"):
        print("That't my steak.")
        case .steak(Cooking.medium, Sauce.mustard, _):
        print("Well, give to me.")
        case .steak(Cooking.medium, Sauce.redWine, let animal):
        print("I dont mind where it came from, give me that \(animal) steak.")
        case let .steak(level, sauce, animal): //모든 연관값을 바인딩할 때
        print("\(level) \(sauce) \(animal) steak well, give me.");
    }
}

steakOlder(Food.steak(Cooking.medium, Sauce.mustard, "Beaf")) //That't my steak.
steakOlder(Food.steak(Cooking.medium, Sauce.mustard, "Pork")) //Well, give to me.
steakOlder(Food.steak(Cooking.medium, Sauce.redWine, "Pork")) 
//I dont mind where it came from, give me that Pork steak.
steakOlder(Food.steak(Cooking.rare, Sauce.ketchap, "Chicken")) 
//rare ketchap Chicken steak well, give me.

프로토콜과 열거형

항목순회 프로토콜

enum School: CaseIterable {
    case elementary, middle, high, university
}

//지정값이 있는 경우
enum School: String, CaseIterable {
    case elementary="초등학교"
    case middle="중학교"
}

+위 내용에 대해서는 map/reduce 학습후 추가로 포스팅 하겠다.(22.7.10)

profile
Developer가 되고싶은 꿈나무
post-custom-banner

0개의 댓글