열거형 : enum [Enumberations]
- 관련있는 데이터들이 멤버로 구성되어 있는 자료형(type) 객체
언제 사용할까?
- 원치 않는 값이 잘못 입력되는 것을 방지
- 입력 받을 값이 한정되어 있을 때
- 특정 값 중 하나만 선택하게 할 때
예시) 색깔선택(빨,노,파,초 ...), 성별선택(남,여) 등
선언 방법
① 한줄로 나열
enum Compass {
case North, South, East, West
}
② 각각의 case문에 멤버들 나열
enum Compass {
case North
case South
case East
case West
}
enum Compass {
case North
case South
case East
case West
}
var north : Compass = .North
print(north)//North
var south = Compass.South
print(type(of:south))//Compass
-멤버별 기능 정의하기
enum Gender {
case Man
case Woman
}
var gender : Gender
gender = .Man
switch gender {
case .Man:
print("남자입니다")
case .Woman:
print("여자입니다")
}
-열거형 멤버별 메서드 정의
enum Gender: String {
case Man, Boy
case Woman, Girl
func printGender() {
switch self {
case .Man, .Boy:
print("남자입니다")
case .Woman, .Girl:
print("여자입니다")
}
}
}
Gender.Girl.printGender() //여자입니다
-rawValue(원시값)
enum Color: Int {
case red
case green = 3
case blue
}
print(Color.red.rawValue) //0
print(Color.green.rawValue) //3
print(Color.blue.rawValue) //4
rawValue는 필수로 지정할 필요는 없다. 원래 기본은 0부터 순서대로 가는건데(red=0, green=1, blue=2) green처럼 임의의 숫자 n이 지정 되었을 때, green의 다음인 blue의 rawValue는 n+1이 된다.
그래서 위 예시를 보면 red의 rawValue를 출력했을 때는 0이지만 그 이후 green은 1이 아닌 3이 나온다.
-String형 값을 갖는 열거형
enum Color: String {
case red = "빨간색"
case green = "초록색"
case blue
}
print(Color.red) //red
print(Color.red.rawValue) //빨간색
print(Color.green.rawValue) //초록색
print(Color.blue.rawValue) //blue
각 케이스마다 String형을 rawValue값으로 주면 어떻게 될까?
정수형 rawValue와 마찬가지로 print하면 지정된 값을 출력하는데 값이 지정되지 않은 blue의 경우는 case명인 blue를 출력한다.
-연관값(associated value)
연관값은 열거에서 각 인스턴스 마다 다른 값들을 가지게 하는 것을 허용해준다.
enum date {
case intDate(Int,Int,Int) //(Int,Int,Int)형 연관값을 갖는 intDate
case stringDate(String) //String형 연관값을 갖는 stringDate
}
var todayDate = date.intDate(2022,4,19) //밑에 주석처리하면 2022년 4월 19일
todayDate = date.stringDate("2022년 3월 27일") //2022년 3월 27일
switch todayDate {
case .intDate(let year, let month, let day):
print("\(year)년 \(month)월 \(day)일")
case .stringDate(let date):
print(date)
}
위 코드에서 date라는 enum[열거형]에 Int와 String 두 가지 타입을 정의한 것을 확인할 수 있다.
enum 자체가 독립된 하나의 타입이기 때문에 실제로 이 인스턴스들을 사용할 때는 똑같이 date형으로 다룰 수 있다.
-옵셔널과 enum, 연관값
let favNum: Int? = 5
switch favNum {
case .none: //none - nil인 경우
print("좋아하는 숫자가 없습니다.")
//some - 값이 있는 상태
case .some(let i) where i < 20:
print("좋아하는 숫자가 20 미만입니다.")
default:
print("좋아하는 숫자가 20 이상입니다.")
}
//결과: 좋아하는 숫자가 20 미만입니다.
옵셔널은 연관 값을 갖는 enum이다. 이 옵셔널 enum에는 none과 some이라는 값이 있는데, none은 값이 없는 상태, some은 값이 있는 상태를 의미한다.
그리고 some은 어떤 값인지도 저장을 해두어야 한다. 그래서 some에는 연관값(associated value)이 담겨있다. 이는 어떤 타입도 가능하게 해주는 Generic이다.
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
여기서<Wrapped>가 Generic이다.
var x : Int? = 20
var y : Int? = Optional.some(10)
var z : Int? = Optional.none
var x1 : Optional<Int> = 30
print(x,y,z,x1) //Optional(20) Optional(10) nil Optional(30)
'iOS > Swift이론' 카테고리의 다른 글
[Swift] array! 배열에 대해 파헤쳐보자! (2) | 2022.12.28 |
---|---|
UIKit (0) | 2022.05.23 |
Swift) 프로토콜과 델리게이트 Protocol, Delegate (1) | 2022.04.12 |
Swift) 클래스와 메서드 (3) | 2022.03.30 |
[iOS]Swift 구조체 (0) | 2022.03.22 |