- Swift Document - Enumeration
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code. - Swift document
즉, enum은 연관된 값을 가진 그룹의 공동된 자료형을 정의하기 위해 사용되는 자료형입니다.
type-safe : enum을 사용함으로써 원하지 않는 값이 잘못 입력되거나, 이미 정의되어 제한된 값 중에서 선택을 하도록하여 잘못된 자료가 입력되는 것을 방지
열거형에서 데이터는 객체 정의 시점에 함께 정의되어 삭제나 변경이 불가능하고 이때 정의된 case를 .[caseName]
으로 접근할 수 있기 때문에 코드의 정확성과 안전성을 높이고 코드의 가독성도 높일 수 있습니다.
또한, Swift
의 열거형은 원시값 (raw value) 를 사용하여 각 경우에 따라 String
, Character
, Int
, Float
을 설정할 수 있습니다.
enum CompassPoint {
case north
case south
case east
case west
}
raw value 가 없는 Enum 을 선언할 때는 enum의 이름과 해당 enum이 가질 수 있는 값들을 case로 설정할 수 있습니다.
var direction1 = CompassPoint.north
var direction2 : CompassPoint = .south
위와 같이 선언하여 사용할 수 있고, 미리 선언된 case의 값들로만 선언을 할 수 있습니다 📌
C 나 Objective-C 에서의 Enum과 달리 Swift에서는 기본적으로 정수값이 할당되지 않습니다.
대신, 각 case에 String
, Character
, Int
, Float
을 raw value 로 설정할 수 있습니다.
enum 선언시 raw value로 가질 자료형을 명시해주면 됩니다!
enum CompassPoint : Int {
case north // 0
case south // 1
case east // 2
case west // 3
}
raw value를 Int형으로 선언하게 되면 첫 case가 0, 다음 case 부터 1씩 증가된 값을 가지게 됩니다.
enum CompassPoint : Int {
case north = 0 // 0
case south // 1
case east = 10 // 10
case west // 11
}
또한, 특정 값을 선언할 수 있고 선언되지 않는 case에 대해서는 이전 case + 1
의 값을 가지게 됩니다.
Int 형이 아닌 자료형에 대해서는 모든 case에 대해 raw value를 선언해야 합니다.
enum CompassPoint : Float {
case north = 1.0 // 1.0
case south = 2.0 // 2.0
case east = 3.0 // 3.0
case west = 4.0 // 4.0
}
위와 같이 선언하거나, 생략하고 싶다면 이전 case 의 raw value를 정수값으로 입력해야합니다.
enum CompassPoint : Float {
case north = 1.0 // 1.0
case south = 2.0 // 2.0
case east = 3 // 3.0
case west // 4.0
}
enum CompassPoint : Character {
case north = "N"
case south = "S"
case east = "E"
case west = "W"
}
Character type 의 경우 모든 case에 대해 raw value를 선언해야합니다!
enum CompassPoint : String {
case north = "North" // North
case south = "South" // South
case east // east
case west // west
}
String type 의 경우 설정되지 않은 raw value는 case의 이름으로 생성되어 편하게 이용할 수 있습니다 😁
enum CompassPoint {
case north
case south
case east
case west
}
var direction : CompassPoint? = .north
switch direction {
case .north :
print("head to north")
case .south :
print("head to south")
case .east :
print("head to east")
case .west :
print("head to west")
default :
print("direction not found")
switch
, for
등 enum을 사용하면 가독성과 안전성 높은 코드를 구현할 수 있습니다!
enum CompassPoint : Int {
case north // 0
case south // 1
case east // 2
case west // 3
}
var direction = CompassPoint.north
print(direction.rawValue) // Optional(0)
Enum의 raw value 접근은 .rawValue
로 접근할 수 있습니다.
이때 Optional
값이 반환됨을 알고 있어야 합니다! (raw value 가 없을 경우 nil 반환!)
enum의 이름 뒤 : CaseIterable
를 입력 (Conforming CaseIterable
Protocol) 하고 [enumName].allCases
을 통해 enum을 하나의 배열처럼 사용할 수 있습니다.
enum CompassPoint : CaseIterable {
case north
case south
case east
case west
}
print(CompassPoint.allCases.count) // 4
for c in CompassPoint.allCases {
print(c)
}
// north
// south
// east
// west
오늘은 더욱 안전성 높고 가독성 높은 코드를 구현할 수 있는 enumeration 열거형 에대해 알아보았습니다.
다음으로 enum의 심화 활용인 Recursive Enumerations
, Associated Values
, Enum Extension
등에 대해 알아보겠습니다!
틀린 정보 또는 궁금한 점이 있다면 댓글 부탁드립니다! 읽어주셔서 감사합니다‼️