티스토리 뷰

Swift

[Swift] Enumerations (열거형)

learner._.Kio 2021. 3. 3. 00:51

목차

  • Enumerations (열거형)
  • Raw Values (원시 값)




Enumerations (열거형)

Enumerations 사용하는 이유

  1. 코드의 가독성이 높아진다.

  2. 코드의 안전성이 높아진다.

// #A
// 나쁜 코드, 값이 변할수도 있고, 그 값이 뭔지 알기 힘듦
let left = 0
let center = 1
let right = 2

var alignment = center


// #B
// #A보다 가독성이 좋아졌으나, 여기에도 문자열이라 오타가 날 수 있음. 
// swift는 대소문자를 구분하기때문에 정해야한다.
let left = "left"
let center = "center"
let right = "right"

var alignment = center
if alignment == "Center" {

}

Enumerations 선언

enum TypeName {
    case caseName
    case caseName, caseName
}

Enumerations 예시

enum Alignment {
    case left
    case right
    case center
}
/*
leftAlignment, rightAlignment, centerAlignment 라고 쓰면 가독성이 높아질 거라 
생각할 수 있는데 이미 열거형 이름을 통해서 정렬을 표현한다는 것을 파악할 수 있기 때문에 
중복된 단어는 제거하고 가장 단순한 이름으로 선언한다.
*/

Alignment.center
// 'Alignment.' 열거형. 을 찍으면 자동완성에 case목록이 표시되어
// 열거형 표시를 보지 않더라도 어떤 case가 있는지 볼 수 있고 오타가 발생할 가능성이 적어진다.

var textAlignment = Alignment.center
// 열거형 case는 값이다.

textAlignment = .left 
// 열거형을 이미 저장했기 때문에 case 이름만 적어도 된다. '.'은 꼭 찍어야 한다.

textAlignment = .Left 
// error, 열거형에 선언한 case만 가능.


if textAlignment == .center {

}
// 열거형 case는 값이기 때문에 비교연산자로 비교한다.

switch textAlignment {
case .left:
    print("left")
case .right:
    print("right")
case . center:
    print("center")
}
// 열거형 case는 if문 보다는 switch문으로 작성하는 게 좋다.




Raw Values (원시 값)

Enumerations은 그 자체로 독립적인 값이지만 내부에 또 다른 값을 저장할 수 있다. 이것을 Raw Values (원시 값)라고 한다. Raw Values은 필수사항이 아니기 때문에 없을 수도 있다.

Raw Values 선언

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

Raw Values: Int

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

Alignment.left.rawValue // 0
Alignment.right.rawValue // 1
Alignment.center.rawValue // 2
// case에 선언된 순서대로 0,1,2라고 되어있다.
enum Alignment: Int {
    case left
    case right = 100
    case center
}

Alignment.left.rawValue // 0
Alignment.right.rawValue // 100
Alignment.center.rawValue // 101
// case에 선언된 순서대로 0,100,101라고 되어있다.
// 원시값을 직접 저장하면 이전 case에서 증가하는 값은 저장되지 않는다.
// 세번째 case에 저장된 값은 정하지 않으면 자동으로 저장되는 기준값은 항상 이전 값이다.

Alignment.left.rawValue = 10 
// error, 선언 이후 원시값을 바꾸는 건 불가능하다.

Alignment(rawValue: 0)      // left
Alignment(rawValue: 200)    // nil, 이 값을 가진 case는 없다. optional

Raw Values: String

enum Weekday: String {
    case sunday
    case monday = "MON"
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
}

Weekday.sunday.rawValue // sunday
// 원시값의 자료형을 String으로 선언하고 원시값을 생략하면 
// case 이름과 동일한 String(문자열)이 원시값으로 저장된다.
Weekday.monday.rawValue // MON

Raw Values: Character

enum ControChar: Character {
    case tab = "\t"
    case newLine = "\n"
}
// 원시값의 자료형을 Character로 선언한 경우에는 반드시 원시값을 직접 저장해야된다.
댓글