본문 바로가기

스피드 문법정리

13. Enumeration

Enumeration

연관된 상수들을 하나의 묶음으로 묶은 자료형이 열겨형, 각 상수는 상수라 부르지 않고 Enumeration Case라고 부름

열거형을 사용하는 이유는 코드의 가독성과 안정성이 높아짐

enum TypeName {
    case caseName
    case caseName, caseName
}

enum Alignment {
    case left
    case center
    case right
}

Alignment.center // center

var textAlignment = Alignment.center
textAlignment = .left

if textAlignment == .center {
}

switch textAlignment {
case .left:
    print("left")
case .right:
    print("right")
 case .center:
    print("center")

Raw Values

Enumeration case는 그 자체로 독립적인 값이지만 내부에 또 다른 값을 저장할 수 있음, Raw Value는 선택사항, Enumeration case와 연관된 또 다른 값을 함께 저장할 때 선택적으로 사용

enum TypeName : RawValueType { // RawValueType -> String, Character, Number Types
    case caseName = Value
}



enum Alignment : Int {
    case left
    case right
    case center
}

Alignment.left.rawValue // 0
Alignment.right.rawValue // 1
Alignment.center.rawValue // 2

enum Alignment : Int {
    case left
    case right = 100
    case center
}

Alignment.left.rawValue // 0
Alignment.right.rawValue // 100
Alignment.center.rawValue // 101

Alignment.center.rawValue // Error / 선언 이후 rawValue 값은 변환 불가

Alignment(rawValue : 0) // left
Alignment(rawValue : 0) // nil
enum Weekday : String {
    case sunday
    case monday = "MON"
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
}

Weekday.sunday.rawValue // sunday
Weekday.monday.rawValue // MON

// 원시값을 의 자료형을 Character로 선언한 경우 원시값을 직접 저장해야함
enum ControlChar : Character {
    case tan = "\t"
    case newLine = "\n"
}

Associated Values

enum TypeName {
    case caseName(Type)
    case caseName(Type, Type, ...)
}

enum VideoInterface {
    case dvi(width : Int, height : Int)
    case hdmi(Int, Int, Double, Bool)
    case displayPort(CGSize)
}

var input = VideoInterface.dvi(width : 2048, height : 1536)

switch input {
case .dvi(2048, 1536):
    print("dvi 2048 x 1536")
case .dvi(2048, _):
    print("dvi 2048 x Any")
case .dvi:
    print("dvi")
case .hdmi(let width, let height, let version, var audioEnabled):
    print("hdmi \(width)x\(height)")
case let .displayPort(size):
    print("dp")
}

input = .hdmi(3840, 2160, 2.1, true)
Raw Value Associated Value
값을 하나만 저장가능
자료형도 동일해야함
열거형 이름 뒤 선언
기존 열거형 값을 생성할 때 저장
값 여러개 저장 가능
다양한 자료형 간으
case 이름 뒤 선언
새로운 열거형 값을 생성할 때 저장

Enumeration Case Pattern

연관값을 가진 열거형 case를 매칭 시킬 때 사용, switch, if , guard, while, for in 문에서 사용

case Enum.case(let name):
case Enum.case(var name):

case let Enum.case(name):
case var Enum.case(name):

enum Transportation {
    case bus(number : Int)
    case taxi(company : String, number : String)
    case subway(lineNumber : Int, express : Bool)
}

var tpt = Transportation.bus(number : 7)

switch tpt {
case .bus(let n):
    print(n)
case .taxi(let c, var n):
    print(c, n)
case let .subway(l, e):
    print(l, e)
}

tpt = Transportation.subway(lineNumber : 2, express : false)

if case let .subway(2, express) = tpt {
    if express {
    
    } else {
  
    }
}

if case. subway(_, true) = tpt {
    print("express")
}
enum Transportation {
    case bus(number : Int)
    case taxi(company : String, number : String)
    case subway(lineNumber : Int, express : Bool)
}

let list = [
    Transportation.subway(lineNumber : 2, express : false)
    Transportation.bus(number : 4412)
    Transportation.subway(lineNumber : 7, express : true)
    Transportation.taxi(company : "SeoulTaxi", number : "1234")
]

for case let .subway(n, _) in list {
    print("subway \(n)")
}
// subway 2, subway 7

for case let .subway(n, true) in list {
    print("subway \(n)")
}
// subway 7

for case let .subway(n, true) in list where == 2 {
     print("subway \(n)")
}
// subway 2  

'스피드 문법정리' 카테고리의 다른 글

15. Property  (0) 2020.06.18
14. Structure and Class  (0) 2020.06.18
12. Collection  (0) 2020.06.16
9. Functions  (0) 2020.06.15
7. Control Transfer Statements, Labeled Statements  (0) 2020.06.12