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 |