Swift - 열거형

이원석·2024년 11월 14일

Swift

목록 보기
9/38

열거형

같은 주제로 연관된 데이터들을 멤버로 구성하여 나타내는 자료형
이미 정해놓은 입력 값만 선택해서 받고 싶을 때 사용
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가지가 있다.

  • Number Type
  • Character Type
  • String Type

Number Type

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
}

Character Type

모든 case에 대해 Raw Value를 선언해줘야 함

enum Position: Character{
	case top = "t"
    case mid = "m"
    case jug = "j"
}

String Type

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 리턴)

Associated Values(연관값)

열거형 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)

Switch 매칭

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)")
}

if 사용법

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")
}

프로토콜을 채택하는 열거형

추후 정리

참조
개발자 소들이
FLIP.LOG

0개의 댓글