꿀똥벌레
꿀똥벌레 개발 블로그
꿀똥벌레
전체 방문자
오늘
어제
  • 분류 전체보기 (90)
    • JAVA (17)
    • SPRING (14)
    • Elasticsearch (4)
    • GRADLE (2)
    • HTML, CSS (0)
    • JAVASCRIPT (0)
    • GIT (1)
    • Vue.js (1)
    • server (1)
    • Python (0)
    • IT리뷰 (0)
    • 인프라 (6)
    • IOS (21)
    • 디자인패턴 (20)
    • Kafka (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • spring
  • java
  • ES
  • 스프링 인티그레이션
  • spring integration
  • 인덱스 템플릿
  • maxConnTotal
  • persistence connection
  • Index
  • KEEPALIVE
  • springintegration
  • maxConnPerRoute
  • SWIFT
  • mappings
  • 엘라스틱서치
  • Index Template
  • 스프링 인테그레이션
  • persistent connection
  • connectionRequestTimeout
  • elasticsearch

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
꿀똥벌레

꿀똥벌레 개발 블로그

IOS

Swift enum

2022. 12. 31. 12:51

원시값이 없는 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 같이 사용하기  (1) 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
    꿀똥벌레
    꿀똥벌레
    개발자 꿀똥벌레 입니다.

    티스토리툴바