스위프트 문법 7 (Enumerations)

스위프트 문법 7 (Enumerations)

- 7 mins

Enumerations

연관된 값의 그룹에 대해 공통 타입을 정의한 뒤 type-safe 하게 해당 값들을 사용 가능

Enumeration Type 이름Pascal Case, 각 caseCamel Case

enum SomeEnumeration{ //대문자로 이름을 만듦 (파스칼 케이스)
    case north
    case south
    case east
    case west
}

let directionToHead = SomeEnumeration.south

이미 위에서 선언과 동시에 SomeEnumeration enum으로 type이 지정되었기 때문에 아래와 같이 그냥 .north라고 입력해도 된다.

directionToHead1 = .north 

Matching Enumeration Values

swich문을 이용한 응용

switch directionToHead {
case .north:
    print("north")
case .south:
    print("south")
case .east:
    print("east")
case .west:
    print("west")
}

Associated Values

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

var productBarcode = Barcode.upc(8, 82351, 35123, 3)

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

Raw Value

enum ASCIIControlCharacter1: Character {  //이렇게 case의 값을 주면 rawValue를 이용해 사용할 수 있다.
  case tab = "\t"
  case lineFeed = "\n"
  case carriageReturn = "\r"
}

ASCIIControlCharacter2.tab                                                      //tab
ASCIIControlCharacter2.tab.rawValue //그 안에서 지정된 값을 사용하려면 이렇게 하면됨        //"    "

아래 두 예제는 일주일이라는 같은 주제를 enum으로 표현했지만 위 예제는 rawValue는 Int, 아래 예제는 String으로 되어있다.

enum Weekday: Int {
  case sunday, monday, tuesday, wednesday, thursday, friday, saturday
}
Weekday.wednesday           //wednesday
Weekday.wednesday.rawValue  //3

enum WeekdayName: String {
  case sunday, monday, tuesday, wednesday, thursday, friday, saturday
}
WeekdayName.monday          //monday 
WeekdayName.monday.rawValue //"monday"

Implicitly Assigned Raw Values

enum WeekDay4: Int{ //Int를 이용할 경우 이렇게 지정한 값 뒤의 case들은 그 수를 이어서 출력하게 된다
    case sunday, monday = 100, tuesday, wednesday, thursday, friday, Saturday
}
WeekDay4.sunday.rawValue        //0
WeekDay4.wednesday.rawValue     //102  따로 지정하지 않앗지만 앞에서 값을 지정했기 때문에 102가됨


enum WeekdayNameAgain: String {
  case sunday, monday = "mon", tuesday = "tue", wednesday, thursday, friday, saturday
}
WeekdayNameAgain.wednesday
WeekdayNameAgain.wednesday.rawValue

Initializing from a Raw Value

enum PlanetIntRaw: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

PlanetIntRaw(rawValue: 2) //이렇게 반대로 값을 넣고 이름을 찾을 수 도 있다.

enum PlanetIntRaw2: String {
    case mercury, venus = "good", earth, mars, jupiter, saturn, uranus, neptune
}
PlanetIntRaw2(rawValue: "good")

let positionToFind = 1

if let somePlanet = PlanetIntRaw(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}

Nested

Function (Enum안의 함수)

enum Device: String {
  case iPhone, iPad, tv, watch
  
  func printType() {
    switch self {
    case .iPad, .iPhone, .tv:
      print("device :", self)
    case .watch:
      print("apple Watch")
    }
  }
}

let iPhone = Device.iPhone
iPhone.printType()
//출력: device : iPhone

Enumerations (Enum 안의 Enum)

enum Wearable {
    //Weigt, Armor은 Wearable의 case가 아니다.
  enum Weight: Int {
    case light = 1
    case heavy = 2
  }
  enum Armor: Int {
    case light = 2
    case heavy = 4
  }
    //helmet과 boots가 Wearable의 case이다.
  case helmet(weight: Weight, armor: Armor)
  case boots
  
  func attributes() -> (weight: Int, armor: Int) {
    switch self {
    case .helmet(let w, let a):
      return (weight: w.rawValue * 2, armor: a.rawValue * 4)
    case .boots:
      return (2, 4)
    }
  }
}

var woodenHelmet = Wearable.helmet(weight: .light, armor: .heavy)
woodenHelmet.attributes()
print(woodenHelmet)

let boots = Wearable.boots

Mutating

새로운 변수를 만들거나 새 값을 넣지 않고 enum 의 값을 변경하려면 mutating을 써야한다.

enum NewRemoteControl {
  case on, off
  
  mutating func next() { //mutating을 이용해야만 값이 변경됨  여기서 self는 remoteControl임
    switch self {
    case .off:
      self = .on
    case .on:
      self = .off
    }
  }
}

var newRemoteControl = NewRemoteControl.on
newRemoteControl.next()
newRemoteControl.next()
comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora