티스토리 뷰

macOS, iOS

[swift] enum과 switch문

SweetDev 2019. 10. 21. 15:11

c언어 할 때부터 enum을 안쓰다싶이 했더니, 아예 enum이랑 멀어진것같다. 

하지만 enum은 꼭 필요한 존재인걸....

 

그리고 swift의 enum은 너어어어무 헷깔린다.  enum 종류를 왜 case로 표현할까...정말 마음에 안든다ㅠㅠ

 

1. 정의

enum Weather{
  case sunny
  case rainy
}

뭐 이런식으로 쓰면 된다. 

 

enum Weather {
  case sunny, rainy
}

이렇게 한줄로 정의해도 된다고 한다!!!

 

 

2. enum을 활용한 switch문

switch문은 if else의 대행같은거라고 생각하면 될듯. 

 

switch weather{
  case .sunny
  case .rainy
  default 
}

이렇게 쓰면 된다. 

 

 

 

3. enum에 함수 넣기

 

" 열거 타입은 Swift내에서 일급 클래스로 취급되며, 클래스가 가지는 계산 프로퍼티나 메소드를 포함하는 것도 가능하며,

이니셜라이저를 가지거나 확장도 할 수 있으며 따라서 프로토콜을 따르도록 정의될 수 있다. "

 

헐... swift의 enum은 C에서의 단순 타입과는 명백하게 다르다. 

 

함수도 넣을 수 있다!!!

 

enum HTTPCode: Int {
        case OK = 200
        case NOT_MODIFY = 304
        case SERVER_ERROR = 500

        var value: String {
                return "HTTP number is \(self.rawValue)"
        }

        func getDescription () -> String {
                switch self {
                case .OK :
                        return "HTTP 코드는 \(self.rawValue)" 입니다
                }
                ....
        }
        
        static func getName() -> String {
                return "이건 HTTPCode야~~"
        }
}

 

 

4. 연관값

" 연관값은 열거 내의 하나의 사례에 대해 각 사례 인스턴스마다 다른 값들을 가지게 하고 싶을 때 사용한다.

이는 개별 사례와 함께 임의의 값들을 함께 저장하게 하여 일반 스칼라 타입의 값들보다 강력하고 엄격한 타입 구분을 적용하면서 매우 유연하게 사용할 수 있게 해준다. "

 

@.@ 뭔소린지 하나도 모르겠다. 

 

enum Barcode {

case upc(Int, Int, Int, Int)

case qrCode(String)

}

 

이런 Barcode 타입을 만들어두면, 얘가 (Int, Int, Int, Int)타입이던, (String)타입이던 상관없이 Barcode로 쓸 수 있다는게 의의 같다.

 

var productBarcode = Barcode.upc(3, 25, 153, 9)

productBarcode = .qrCode("helloworld")

switch productBarcode {

case .upc(let a, let b, let c, let d):

     print("UPC: \(a), \(b), \(c), \(d)")

case let .qrCode(message):

    print("QRCode: \(message)")

}

 

 

?? 근데 case let은 뭐지 ???

 

case let으로 쓰면, 

case .으로 쓴것과 달리 인자들에 let a, 이런식으로 귀찮게 안붙여줘도 된다. 

!!!!!!!!!충격..

 

 

[연관값을 이용한, 기본은 Double인데 Dummy타입을 만든 예제]

 

struct Temperature<A> {

var value: Double

}

이렇게 제너릭 타입을 하나 만들어서...

 

struct Kelvin {}

struct Fernheit {}

struct Celcius {}

 

이렇게 타입을 세가지를 만들어서...

 

let temp_c : Temperature<Celcius> = Temperature(value: 28.9)

 

그럼 이렇게 쓸 수 있게 된다!!

 

enum Temperature {

case celcius(Double)

case fernheit(Double)

case kelvin(Double)

var celciusValue: Double { 

switch self {

  case let .celcius(value):

    return value

  case let .fernheit(value):

    return (value - 32) * 5 / 9

  case let .kelvin(value):

    return value + 273 }

  }

}

 

 

enum안에 case만 만드는게 아니라, switch self를 지정할 수도 있다...

 

저 예제가 너무 어려워서 다른 예제를 가지고 왔다.

 

 

enum Device {

    case iPad, iPhone

    var year: Int {

        switch self {

        case .iPhone: return 2007

        case .iPad: return 2010

        }

    }

}

let myDevice = Device.iPad

print(myDevice.year)

 

 

 

 

 

 

참고 사이트

- 어느 갓갓님의 enum 정리...

https://soooprmx.com/archives/7163

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함