반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • 코딩테스트
    • Android
    • 예제
    • 타입
    • 프로그래머스
    • JSP
    • IT
    • 프로그래밍
    • xcode
    • 공부
    • swift
    • 구축
    • swfit
    • reduce
    • ios
    • Java
    • 개발
    • level1
    • kotlin
    • map

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    Swift 사용자 정의 타입 - enum
    Language/Swift

    Swift 사용자 정의 타입 - enum

    2021. 3. 11. 18:15
    반응형
    • swift의 열거형은 다른 언어와는 많이 다름으로 잘 살펴봐야 합니다.

    기본 형태

    enum EnumName{
    	//한줄에 하나씩 정의도 가능하고
    	case one
    	case two
    	//한줄에 여러개 정의도 가능합니다.
    	case three, four, five
    }

    인스턴스 생성

    var count = EnumName.one

    * count는 초기화시에 타입추론이 되서 EnumName의 형을 갖게 됩니다.

     

     

    축약형 문법 (dot syntax)

    count의 형이 EnumName으로 한번 정의되면,

    다음 값을 할당시 형을 생략한 점문법을 이용해서

    값을 항당하는 축약형 문법을 사용할 수 있습니다.

    enum EnumName{
    	case one
    	case two
    	case three, four, five
    }
    
    var count = EnumName.one
    print (count) //one
    
    count = .two
    print (count) //two

     

    Raw 값

    C 및 objective-C처럼 case에 raw값을 지정할 수 있습니다.

    String, Character, Integer, Float등의 다양한 형을 사용할 수 있습니다.

    단, 각 값은 유일한 값으로 중복되어서는 압니다.

    enum EnumName: String{
    	case one = "하나"
    	case two = "둘"
    	case three = "셋"
    }
    
    var count = EnumName.one
    
    print(count) //one
    print(count.rawValue) //하나

     

    Raw값 암시적으로 할당하기

    //1. 하나의 raw값 입력으로 모든 값 할당
    enum EnumName: Int{
    	case one = 1, two, three
    }
    
    var count = EnumName.one
    print(count.rawValue) // 1
    
     count = .two
     print(count.rawValue) // 2
    
    //2. String을 raw값을 사용한다면 case 텍스트가 raw값이 됨.
    enum EnumName: String{
    	case one, two, three
    }
    
    var count = EnumName.one
    print(count.rawValue) // one
    
     count = .two
     print(count.rawValue) // two

     

    Raw값을 이용한 초기화

    enum EnumName: Int{
    	case one = 1, two, three
    }
    
    let apple: EnumName = EnumName(rawValue: 1)
    /*
    error: value of optional type 'EnumName?' must be unwrapped to a value of type 'EnumName'
    let apple: EnumName = EnumName(rawValue: 1)
    */
    
    let apple: EnumName? = EnumName(rawValue: 1)
    print(apple) //Optional(SwiftPlayground.EnumName.one)
    
    if let apple: EnumName = EnumName(rawValue: 1) {
        print(apple) // one
    }
    
    if let apple: EnumName = EnumName(rawValue: 1) {
        print(apple.rawValue) //1
    }

    왜 이런 결과가 나오는걸까요?

    rawValue를 통해 초기화할 수 있습니다만,

    rawValue가 case에 해당하지 않는다면 nil값이 되기 됩니다.

    그래서 rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입이라 언래핑이나 바인딩을 해줘야 합니다.

     

     

    메서드 및 Switch구문과 연계

    enum Number {
    	case zero
    	case one, two, three
    	case four, five, six
    	case seven, eight, nine
    	case ten
    	
    	func printMessage() {
    		switch self {
    		case .zero:
    			print("가장 작은수입니다.")
    		case .one, .two, .three:
    			print("비교적 작은 수 입니다.")
    		case .four, .five, .six:
    			print("보통크기의 수 입니다.")
    		case .seven, .eight, .nine:
    			print("비교적 큰 수입니다.")
    		case .ten:
    			print("가장 큰 수입니다.")
    		}
    	}
    }
    
    Number.five.printMessage() //보통크기의 수 입니다.

     

     

    관련 값 (Associated Values)

    열거형의 각 case에 사용자 정의타읍의 추가적인 정보를 저장할 수 있습니다.

    만약, 사과박스에 4가지 구분으로 이루어진 숫자와, 2953개의 문자로 구성된

    QR코드의 형태로 이루어진 두 가지 정보를 같는다면,

    다음과같이 정의하고 사용할 수 있습니다.

    enum Barcode{
    	case upc(Int, Int, Int, Int)
    	case qrCode(String)
    }
    
    var appleBarcode = Barcode.upc(2, 3512, 1124, 6)
    appleBarcode = .qrCode("SDGFABVAGGGDE")

     

    관련값을 처리하는 Switch 구문입니다.

    switch appleBarcode {
    	case .upc(let numberSystem, let manufacturer, let product, let check):
    		print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
    	case .qrCode(let productCode):
    		print("QR code: \(productCode).")
    }
    //print "QR code: SDGFABVAGGGDE." 

    위의 구문을 보시면, case안의 값이 전부 공통값을 가지고 있죠?

     

    switch appleBarcode {
    	case let .upc(numberSystem, manufacturer, lproduct, check):
    		print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
    	case let .qrCode(productCode):
    		print("QR code: \(productCode).")
    }
    //print "QR code: SDGFABVAGGGDE." 

    위 구문처럼 case안의 공통된 값을 case뒤에 선언해서 보다 간결하게 선언할 수 있습니다.

     

     


    공부에 도움을 준 사이트들

    전체적인 공부 가이드라인

    yagom.net

     

    야곰닷넷 - yagom.net

    iOS 개발자들의 놀이터, 배움터, 모임터, 기록보관소 야곰닷넷입니다.

    yagom.net

    공식 문서 변역 사이트

    https://jusung.gitbook.io/the-swift-language-guide/language-guide/08-enumerations

     

    열거형 (Enumerations)

     

    jusung.gitbook.io

    추가 참고

    https://value-of-coding.tistory.com/5

     

    스위프트(Swift) - 열거형(enum)

    스위프트에서 열거형은 같은 부류에 속하는 요소들을 묶어서 표현할 수 있는 타입입니다. 다른 타입들과 다르게 한번 선언한 이후에는 추가하거나 수정이 불가합니다. 그래서 보통 정해진 범위

    value-of-coding.tistory.com

    반응형

    'Language > Swift' 카테고리의 다른 글

    Swift 클로저  (0) 2021.03.11
    Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리]  (0) 2021.03.11
    Swift 사용자 정의 타입 - Class  (0) 2021.03.11
    Swift 사용자 정의 타입 - Struct  (0) 2021.03.11
    Swift 옵셔널  (0) 2021.03.11
      'Language/Swift' 카테고리의 다른 글
      • Swift 클로저
      • Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리]
      • Swift 사용자 정의 타입 - Class
      • Swift 사용자 정의 타입 - Struct
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바