Swift Enumeration


Swift Enumeration


* 스스로 공부 및 정리를 위해 The Swift Language Guide을 요약 및 정리 한 내용입니다.

열거형(Enumeration)

  • 열거형은 관련된 값으로 이루어진 그룹을 공통의 형으로 선언하는 것입니다.
  • 열거형은 1급 클래스형(first-class type)이어서 계산된 프로퍼티를 제공하거나 초기화를 지정하거나, 초기 선언을 확장해 사용할수있습니다.
  • 열거형은 유니티 C#에서도 많이 사용됩니다. 유저데이터라거나, 아이탬타입 관리등에서 자주사용했었습니다.
  • Swift의 열거형은 case별로 integer값을 할당하지않습니다. case별로 암시적으로 0,1,2…같은 값을 가지지 않는다는 의미입니다.
  • ,를 통해 구분해서 한줄에 적을수 있습니다
  • 각 열거형은 새로운 type을 정의합니다. 형의 이름은 대문자로 시작해야합니다.

열거형 문법(Enumeration Syntax)

  • enum 키워드를 사용해 열거형을 정의합니다
  • enum 이름 { enumeration definition } 형태입니다
enum CompassPoint {
    case north
    case south
    case east
    case west
}
enum AminalType {
    case mammalia, Pisces, Reptilia, Aves, Tetrapoda, Osteichthyes, Chondrichthyes, Placodermi
}
var cat = AminalType.mammalia
print(type(of: cat))

Switch 구문에서 열거형 값 매칭하기(Matching Enumeration Value with a Switch Statement)

  • 각 열거형 값을 Switch 문에서 매칭 할수 있습니다.
  • switch문은 반드시 모든 열거형의 모든 case를 완전히 포함해야합니다.
  • 완전히 포함시키 힘들경우 default를 사용할수 있습니다.
var whatisthisAnimal = AminalType.Pisces
switch whatisthisAnimal {
case .mammalia:
    print("Dog","Cat")
case .Pisces:
    print("fish")
default:
    print("We finish soon")
}

관련 값 (Associated Value)

  • 열거형의 각 custom type의 추가적인 정보를 저장할수 있습니다.
  • 예를들어, 타입을 제한하는등이 있습니다.
  • Switch와 혼용해서 더다양하게 사용할수있습니다(변수,상수로선언)
enum Barcode {
    case upc (Int,Int,Int,Int)
    case qrcode (String)
}
var clothBarcode = Barcode.upc(4,42553, 64564, 3)
print(clothBarcode)

enum Sbarcode{
    case upc (String,Int,String,Int)
}
var gameboard = Sbarcode.upc("XXbox", 400, "Mico", 210601 )
switch gameboard {
case .upc(var productname, var pruductprice , var barcodenumber, var madeday):
    print("UPC : \(productname) and \(pruductprice), \(barcodenumber), \(madeday)")
//case var .upc ( productname,  pruductprice ,  barcodenumber,  madeday): 처럼 사용도 가능합니다.
}

Raw 값 (Raw Value)

  • case에 raw값을 지정할수 있습니다.
  • String, Charactor, Integer, Float등의 형을 사용할 수 있습니다.
  • Raw 값은 유일한 값으로 중복되어서는 안됩니다.
  • 암시적으로 Raw값을 할당할수도 있습니다.
  • raw값은 rawValue 프로퍼티를 사용해 접근할수 있습니다.
  • raw값을 이용해 열거형 변수를 초기화 할 수 있습니다. 6번째줄은 rawValue: 6을 기준으로 열거형 변수의 초기 값으로 지정합니다.
enum AminalType:Int {
    case mammalia = 1, Pisces, Reptilia , Aves , Tetrapoda, Osteichthyes, Chondrichthyes, Placodermi
}
var cat = AminalType.mammalia
print(cat.rawValue)
let Bonyfish = AminalType(rawValue: 6)

재귀 열거자 (Recursive Enumeration)

  • 다른 열거 인스턴스를 관계 값으로 갖는 열거형 입니다. case앞에 indirect를 붙여 표시합니다.
  • 모든 case에 indirect를 붙여야 한다면, enum 키워드앞에 indirect를 표시합니다.
indirect enum numbers {
    case number(Int)
    case addition(numbers, numbers)
    case minus(numbers, numbers)
}
let five = numbers.number(5)
let four = numbers.number(4)
let sum = numbers.addition(five, four)
let minus = numbers.minus(five, four)

func evaluate(_ expression: numbers) -> Int {
    switch  expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .minus(left, right):
        return evaluate(left) * evaluate(right)
    }
}

print(evaluate(sum))