원시값이 없는 enum
enum BodyPart {
case head
case arm
case leg
//또는
case head, arm, leg
}
let bady: BadyPart = .head
원시 값(Raw Value) 이 있는 열거형
Int 를 원시 값으로 갖는 열거형
enum BodyPart: Int {
case head, arm, leg
}
- 각각 순서대로 0, 1, 2 가 rawValue에 할당 되어진다.
enum BodyPart: Int {
case head = 10, arm, leg = 30
}
enum BodyPart: String {
case head = "head!", arm, leg="leg!"
}
- Int형 열거형의 경우는 값을 지정하지 않은 값은 이전 열거형 + 1 값이 rawValue에 할당 된다.
- Int, String 열거형이 아닌 경우는 값을 무조건 지정 해주어야 한다.
- String 열거형은 지정하지 않는 경우 case와 동일한 값으로 rawValue가 지정된다.
연관 값(associated value)을 가지는 열거형
enum BodyPart2 {
case head(name: String, size: Int)
case body(name: String, size: Int)
case leg(name: String, length: Int, qty: Int)
}
//사용
let bodyPart2: BodyPart2 = .leg(name: "테스트", length: 100, qty: 2)
switch (bodyPart2) {
//지정된 값들과 맞는 case문 실행
case .leg(name: "테스트", length: 100, qty: 1):
print("다리가 1개고 길이가 100인 테스트")
case .leg(name: "테스트", length: 100, qty: 2):
print("다리가 2개고 길이가 100인 테스트")
//맞는 값이 없다면, 변수 바인딩 케이스문 실행
case .leg(name: let name, length: let length, qty: let qty):
print("다리가 \(qty)개고 길이가 \(length)인 \(name)")
case .head(name: let name, size: let size):
print(2)
case .body(name: let name, size: let size):
print(3)
}
연관 값 if 매칭
enum에 연관 값이 있는 경우 if aaa == .aaa 하면 컴파일 에러가 난다.
if case 문을 통해 비교를 해야 한다. (좌측 enum 틀에 오른쪽 case 가 할당이 가능한가? 로 판단한다.)
let bodyPart2: BodyPart2 = .body(name: "테스트", size: 1)
//이 조건문은 컴파일 에러!
if BodyPart2.body(name: "테스트", size: 1) == bodyPart2 {
}
if case BodyPart2.body(name: "테스트", size: 1) = bodyPart2 {
print("출력됨")
}
//조건에 맞지 않는다.
if case BodyPart2.body(name: "테스트22", size: 1) = bodyPart2 {
print("출력 안됨")
}
if case BodyPart2.body(name: _, size: 1) = bodyPart2 {
print("출력됨")
}
if case let BodyPart2.body(name: myName, size: 1) = bodyPart2 {
print("출력됨")
print("내 이름은 \(myName)")
}
// if case let BodyPart2.body(name: myName, size: size) 이랑 동일 표현
if case BodyPart2.body(name: let myName, size: let size) = bodyPart2 {
print("출력됨")
print("내 이름은 \(myName) 이고, 사이즈는 \(size) 이다.")
}
- 연관 값이 있는 경우 case, = 으로 조건 을 비교한다.
- case let 으로 연관값을 변수명으로 받아서 사용할 수 있다.
프로토콜을 채택하는 열거형
enum BodyPart: Int, CaseIterable {
case head=10, body, leg = 8
}
- enum에서 채택할 raw value는 상속 가장 첫번째에 와야 한다.(Int, String, Char, Float, Double...)
- 두번째부터는 enum 에서 채택 할 프로토콜을 기입한다.
'IOS' 카테고리의 다른 글
Swift GCD (0) | 2023.02.02 |
---|---|
ObservableObject 와 Codable 같이 사용하기 (0) | 2022.12.31 |
Swift 에러 핸들링 (try, catch, throw, throws, do) (0) | 2022.12.28 |
UIKit 커스텀 애니메이션 (0) | 2022.12.20 |
SwiftUI NavigationView BackButton Custom (0) | 2022.11.05 |