enum에 별명주기 (CustomStringConvertible Protocol)

Enumeration | 열거형


C언어와 달리 Swift에서 Enum type은 다양하게 활용될 수 있다.
C언어 에서는 enum의 경우 Integer 값을 갖지만, Swift에서는 integer 뿐만 아니라 String type도 갖을 수 있다.  또한 각각의 case 별로 rawValue를 갖아서 원하는 경우에 사용가능하다.
그런데 이런 enum에 별명처럼 또 다른 값을 넣을 수 없을까?
예전에 이 문제 때문에 고민고민하고 찾아 보다가 오늘 새로운 것을 발견했다.
enum에 CustomStringConvertible의 protocol를 채택하는 것이다.
description property를 사용해서 각각의 case에 맞게 switch 문을 통해 별도의 String 값 등을 보낼 수 있다. 처음엔 연관값을 활용할까 고민도 했지만, 연관값은 공용체랑 비슷한 개념이라고 한다. 이 부분은 더 공부해야겠다. 
여튼 이번에 알게 된 CustomStringConvetible protocol은 다른 type에도 적용이 가능할 것 같다.
Swift는 파면 팔수록 신기한게 많은 것 같다. iOS개발자가 된 것! 좀 어렵지만 잘한 것 같다.

  • 예제 코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import UIKit
enum Region: CustomStringConvertible {
  case seoul
  case incheon
  case busan
  case daegu
  
  var description: String {
    get {
      switch self {
      case .busan:
        return "BUSAN"
      case .seoul:
        return "SEOUL"
      case .incheon:
        return "INCHEON"
      case .daegu:
        return "DAEGU"
      }
    }
  }
}
let seoul = Region.seoul
let incheon = Region.incheon
let busan = Region.busan
let city = [seoul, incheon, busan]
city.forEach { print($0) }
enum Color {
  case red
  case green
  case blue
  
  var description: String {
    get {
      switch self {
      case .red:
        return "빨강"
      case .green:
        return "초록"
      case .blue:
        return "파랑"
      }
    }
  }
}
let colors = [Color.red, Color.green, Color.blue]
colors.forEach { print($0) }
enum AppleDevice: String, CustomStringConvertible {
  
  case iPhone = "iPhonePro"
  case iPad = "iPad Pro"
  case macBook = "MacBook Pro"
  case watch = "appleWatch"
  
  var description: String {
    switch self {
    case .iPhone:
      return "아이폰"
    case .iPad:
      return "아이패드"
    case .macBook:
      return "맥북"
    case .watch:
      return "애플시계"
    }
  }
}
print("\n=========================\n")
let appleDeviceRawValues = [
  AppleDevice.iPhone.rawValue,
  AppleDevice.iPad.rawValue,
  AppleDevice.macBook.rawValue,
  AppleDevice.watch.rawValue
]
appleDeviceRawValues.forEach { print($0) }
print("\n=========================\n")
let appleDeviceDescriptions = [
  AppleDevice.iPhone,
  AppleDevice.iPad,
  AppleDevice.macBook,
  AppleDevice.watch
]
appleDeviceDescriptions.forEach { print($0)}
cs

  • 결과

SEOUL
INCHEON
BUSAN
red
green
blue

=========================

iPhonePro
iPad Pro
MacBook Pro
appleWatch

=========================

아이폰
아이패드
맥북
애플시계




댓글

이 블로그의 인기 게시물

Naming : 의미 있는 이름

깨끗한 코드는 한 가지를 제대로 한다.