Swifter {Swift Developer}

메뉴

열거형(enum)

열거형은 여러가지 값을 단일 단위로 나타내는 데이터형이다. 다른 프로그래밍 언어에서도 열거형은 존재하며, 스위프트언어는 열거형 함수를 가지게 하거나 열거자 값을 갖게 하거나 할 수 있는 특징이 있다.

(1) 열거형

enum 열거형명 {

case 열거자1

case 열거자2

…..

}

또는

enum 열거형명 {

case 열거자1, 열거자2, ….

}

 

C#과 같은 언어의 열거형에서는 각 열거자를 내부에 Inr형 값을 가지고 있기 때문에 열거형을 숫자로 변환할 숫자를 열거자를 캐스팅할 수 있다. 스위프트언어에서는 정의된 열거형은 내부적인 값을 가지고 있지 않기 때문애 열거자에 숫자로 열거자로 변환할 수 없다. 스위프트 열거자에 내부적인 값(RAW값)을 가지는 부분에 대해서는 따로 설명한다.

 

enum Gender {

case Male // 남

case Female // 여

}

 

위 예제는 성별을 구분하는 Gender라는 열거형을 정의한 것이다. 남자를 나타내는 Male과 여자를 나타내는 Female이라는 두가지 열거자를 가지고 있다.정의된 열거형은 새로운 형으로 사용할 수 있고 각 열거자는 열거형명.열거자라는 형식이 사용되었다.

var gd = Gender.Male

let person = Gender.Female

gd = .Female

 

열거자를 할당된 변수나 상수는 형추론에 의해 Gender 열거형으로 간주된다. 이미 변수형이 결정되는 경우, 열거형명을 선택하고 값을 다시 할당할 수 있다. 마지막 3번째는 Gender열거형이 변수 gd에 대입하기 때문에 열거명을 생략하고 “.”을 찍고 열거명을 지정할 수 있다.

 

(2) 열거형의 비교

열거형 값을 if문으로 비교하는 예제로 이해해 보자. 앞에서 만든 Gender 열거형을 사용하여 gd에 할당되어 있는 열거자들을 비교해서 결과를 보여주는 예제를 살펴보자.

enum Gender {

case Male

case Female

}

 

var gd = Gender.Male

 

if gd == Gender.Male {

print(“남자”)

} else {

print(“여자”)

}

 

또한, Gender열거자를 할당한 변수 gd를 switch문으로 체크한다면 switch문의 조건은 gd변수를 지정하고 case문에 Male인지 Female인지를 구분하도록 한다. 이때 열거형이 지정되어 있다면 형추론이 가능하기 때문에 열거명을 생략할 수 있다.

 

 switch gd {

case .Male:

print(“남자”)

case .Female:

print(“여자”)

}

 

(3) 열거자를 Raw값으로 지정하기

열거형의 각 열거자를 모두 동일한 데이터형으로 사용하는 경우 Raw값을 지정할 수 있다. 앞서 만든 Gender열거형의 Male과 Female에 Raw값을 지정해보면, 다음과 같이 구현할 수 있다.

 

enum Gender: Int {

case Male = 1

case Female = 2

}

 

모든 Raw값을 이전값+1이 되는 순차적인 지정을 하려면 첫번째값을 지정한 뒤에 다음 열거자에 대해서는 Raw대입을 생략한다. 이러면 자동으로 이전값+1을 통해 각각의 열거자에 할당된다. 즉 이를 자동증가라는 기능이다.  또한, 자동증가로 사용할 수 있는 열거형이 Int인 경우만 가능하다.

값을 제대로 지정되고 있는지를 디버깅해보려면, print(“Gender.Female.rawValue)로 출력해볼 수 있다. 물론 String으로 열거자값을 지정할수도 있다.

 

(4) 열거형 함수

스위프트 언어의 열거형은 함수를 가질 수 있다.

enum Gender: String {

case Male = “남성”

case Female = “여성”

 

func prinfItem() {

switch self {

case .Male:

print(“남자다!”)

case .Female:

print(“여자다!”)

}

}

}

 

var gd = Gender.Male

gd.prinfItem()

 

 

앞에서 만들었던 Gender열거형에 printItem()이라는 함수를 추가한 경우다.

 

(5) Raw값에 열거값을 생성하기

열거형의 열거값은 Raw값에서 생성이 가능하다.

enum Gender: String {

case Male = “남성”

case Female = “여성”

}

 

var value:Gender! = Gender(rawValue: “남성”)

print(value.rawValue) // 남성

 

Gender.Male의 Raw값이 남성이면 남성이라는 문자열이 열거값으로 생성된다. Raw값에서 열거자를 생성하는 형식은 다음과 같다.

열거형(rawValue: 열거 나타내는 Raw값)

(6) 값을 가진 열거자

열거형의 열거자는 값을 가질 수 있다. 열거자 값이 있는 경우 아래와 같은 형태를 가진다.

case 열거자(가지게될 값 데이터형)

 

enum Cooking {

case Fruit(String)

case Vegetable(String)

}

 

let fruit1 = Cooking.Fruit(“망고”)

let fruit2 = Cooking.Fruit(“사과”)

 

switch fruit1 {

case .Fruit(“망고”):

print(“Mango”)

case .Fruit(“사과”):

print(“Apple”)

default:

print(“과일없음”)

}

 

 

Cooking이라는 열거형으로 Fruid와 Vegetable을 가지는 열거형이 정의도 있고 이런 Fruit와 Vegetable은 String값을 가질 수 있다. 사실 Fruit열거자는 망고, 사과라는 이름을 값으로 가지게 하고 있다. 변수 fruit1, fruit2모두 동일한 열거형 Fruit이지만 이 값이 다르다는 것을 기억하자.

열거값은 switch문을 사용하여 확인할 수 있다.

 

(7) 여러개의 값을 가진 열거자

열거자는 여러개의 값을 가질 수 있다.

enum Cooking {

case Fruit(String, Int)

case Vegetable(String, Int)

}

 

let fruit1 = Cooking.Fruit(“망고”, 2500)

let fruit2 = Cooking.Fruit(“사과”, 900)

 

switch fruit1 {

case let .Fruit(“망고”, price):

print(“Mango = (price)원”)

case let .Fruit(fruitname, price):

print(“(fruitname) = (price)원”)

default:

print(“과일없음”)

}

Cooking 열거자에 정의한 Fruit, Vegetable을 변경해서 String과 Int형 값을 가질 수 있도록 하여 과일명과 가격을 받도록 구성한다. Fruit값을 switch문으로 판단하고 망고가 맞으면 Int형으로 받은 가격을 표시하도록 했다.

타이틀이미지출처: treehouse

Facebook Comments

카테고리:   Swift

댓글

죄송하지만 댓글은 닫혀 있습니다.