같은 주제로 연관된 데이터들을 멤버로 구성하여 나타내는 자료형
이미 정해놓은 입력 값만 선택해서 받고 싶을 때 사용
Heap에 저장되는 String 과 달리 Enum은 값 형식으로 Stack 저장되어 성능면에서 이득
enum Position {
case top
case mid
case jug
}
enum Position {
case top, mid, jug
}
var user1: Position = .top
열거형의 case는 원시값을 지정해 줄 수 있다. 이를 Raw Value 라고한다.
Raw Value의 자료형은 총 3가지가 있다.
Int라는 타입을 명시하면 가장 먼저 선언된 case부터 0부터 1씩 증가된 값이 들어감
enum Position: Int {
case top //0
case mid //1
case jug //2
}
Raw Value를 지정해 줄 수 있고, 지정하지 않은 case는 바로 이전 case의 값에서 + 1 값으로 세팅
enum Position: Int{
case top = 21 //21
case mid //22
case jug = 30 //30
}
Int가 아닌 자료형으로 했을 경우에, 모든 case에 대해 값을 지정해 주지 않을경우 에러 발생
enum Position: Double{
case top = 1.0 //1.0
case mid //에러
case jug = 3.0 //3.0
}
Int형이 아니더라도 이전 값이 정수 값일 경우 이전 case 값 + 1 로 세팅
enum Position: Double{
case top = 1 //1.0
case mid //2
case jug = 3.0 //3.0
}
모든 case에 대해 Raw Value를 선언해줘야 함
enum Position: Character{
case top = "t"
case mid = "m"
case jug = "j"
}
Raw Value를 지정하지 않으면, case 이름과 동일한 Raw Value가 자동으로 세팅
enum Position: String {
case top //top
case mid //mid
case jug = "slave" //slave
}
var user1: Position = .jug
user1 //jug
user1.rawValue //"slave"
var user2 = Position(rawValue: "mid") //Raw Value를 통하여 열거형 생성
var user3 = Position(rawValue: "sup") //만약 없는 Raw Value 값 대입 시
//(없는 Raw Value일 경우, nil 리턴)
열거형 case에 원시값 대신 연관된 값을 저장하여 원시값의 한계를 해결
원시값의 한계
enum TypeName {
case caseName(Type)
case caseName(Type, Type, ...)
}
//예제
enum AppleDevice {
case iPhone(model: String, Storage: Int) //named tuple
case iMac(size: Int, model: String, price: Int) //named tuple
case macBook(String, Int, Int) // unnamed tuple
}
let product: AppleDevice = .iPhone(model: "8", storage: 64)
var gift = AppleDevice.iPhone(model: "X", storage: 256)
switch gift {
case .iPhone(model: "X", storage: 256):
print("iPhone X and 256GB")
case .iPhone(model: "X", _)
// 와일드카드 패턴 사용 가능
print("iPhone X")
case .iPhone:
// 연관값 생략 가능
print("iPhone")
case .iPhone(let model, let storage):
// 블록 내부에서 연관값을 사용할 땐 상수로 바인딩
// 값을 변경할 때는 var 로 변경가능
print("iPhone \(model) and \(storage)GB")
case let .iMac(size, model, price):
// 모든 연관값을 동일한 형태로 바인딩한다면
// let 키워드를 열거형 케이스 앞에 표기하는 것도 가능
print("iMac \(size), \(model), \(price)")
}
let product: AppleDevice = .iPhone(model: "8", storage: 64)
if case let .iPhone("8", storage) = product { //product의 첫 번째 연관값이 "8"이면 매칭
print(storage)
}
if case .iPhone(_, 64) = product { //Product의 첫 번쨰 연관 값은 상관 없고, 두 번쨰 연관값이 64면 매칭
print("iPhone 64GB")
}
추후 정리