- swift의 열거형은 다른 언어와는 많이 다름으로 잘 살펴봐야 합니다.
기본 형태
enum EnumName{
//한줄에 하나씩 정의도 가능하고
case one
case two
//한줄에 여러개 정의도 가능합니다.
case three, four, five
}
인스턴스 생성
var count = EnumName.one
* count는 초기화시에 타입추론이 되서 EnumName의 형을 갖게 됩니다.
축약형 문법 (dot syntax)
count의 형이 EnumName으로 한번 정의되면,
다음 값을 할당시 형을 생략한 점문법을 이용해서
값을 항당하는 축약형 문법을 사용할 수 있습니다.
enum EnumName{
case one
case two
case three, four, five
}
var count = EnumName.one
print (count) //one
count = .two
print (count) //two
Raw 값
C 및 objective-C처럼 case에 raw값을 지정할 수 있습니다.
String, Character, Integer, Float등의 다양한 형을 사용할 수 있습니다.
단, 각 값은 유일한 값으로 중복되어서는 압니다.
enum EnumName: String{
case one = "하나"
case two = "둘"
case three = "셋"
}
var count = EnumName.one
print(count) //one
print(count.rawValue) //하나
Raw값 암시적으로 할당하기
//1. 하나의 raw값 입력으로 모든 값 할당
enum EnumName: Int{
case one = 1, two, three
}
var count = EnumName.one
print(count.rawValue) // 1
count = .two
print(count.rawValue) // 2
//2. String을 raw값을 사용한다면 case 텍스트가 raw값이 됨.
enum EnumName: String{
case one, two, three
}
var count = EnumName.one
print(count.rawValue) // one
count = .two
print(count.rawValue) // two
Raw값을 이용한 초기화
enum EnumName: Int{
case one = 1, two, three
}
let apple: EnumName = EnumName(rawValue: 1)
/*
error: value of optional type 'EnumName?' must be unwrapped to a value of type 'EnumName'
let apple: EnumName = EnumName(rawValue: 1)
*/
let apple: EnumName? = EnumName(rawValue: 1)
print(apple) //Optional(SwiftPlayground.EnumName.one)
if let apple: EnumName = EnumName(rawValue: 1) {
print(apple) // one
}
if let apple: EnumName = EnumName(rawValue: 1) {
print(apple.rawValue) //1
}
왜 이런 결과가 나오는걸까요?
rawValue를 통해 초기화할 수 있습니다만,
rawValue가 case에 해당하지 않는다면 nil값이 되기 됩니다.
그래서 rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입이라 언래핑이나 바인딩을 해줘야 합니다.
메서드 및 Switch구문과 연계
enum Number {
case zero
case one, two, three
case four, five, six
case seven, eight, nine
case ten
func printMessage() {
switch self {
case .zero:
print("가장 작은수입니다.")
case .one, .two, .three:
print("비교적 작은 수 입니다.")
case .four, .five, .six:
print("보통크기의 수 입니다.")
case .seven, .eight, .nine:
print("비교적 큰 수입니다.")
case .ten:
print("가장 큰 수입니다.")
}
}
}
Number.five.printMessage() //보통크기의 수 입니다.
관련 값 (Associated Values)
열거형의 각 case에 사용자 정의타읍의 추가적인 정보를 저장할 수 있습니다.
만약, 사과박스에 4가지 구분으로 이루어진 숫자와, 2953개의 문자로 구성된
QR코드의 형태로 이루어진 두 가지 정보를 같는다면,
다음과같이 정의하고 사용할 수 있습니다.
enum Barcode{
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var appleBarcode = Barcode.upc(2, 3512, 1124, 6)
appleBarcode = .qrCode("SDGFABVAGGGDE")
관련값을 처리하는 Switch 구문입니다.
switch appleBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
//print "QR code: SDGFABVAGGGDE."
위의 구문을 보시면, case안의 값이 전부 공통값을 가지고 있죠?
switch appleBarcode {
case let .upc(numberSystem, manufacturer, lproduct, check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}
//print "QR code: SDGFABVAGGGDE."
위 구문처럼 case안의 공통된 값을 case뒤에 선언해서 보다 간결하게 선언할 수 있습니다.
공부에 도움을 준 사이트들
전체적인 공부 가이드라인
야곰닷넷 - yagom.net
iOS 개발자들의 놀이터, 배움터, 모임터, 기록보관소 야곰닷넷입니다.
yagom.net
공식 문서 변역 사이트
https://jusung.gitbook.io/the-swift-language-guide/language-guide/08-enumerations
열거형 (Enumerations)
jusung.gitbook.io
추가 참고
https://value-of-coding.tistory.com/5
스위프트(Swift) - 열거형(enum)
스위프트에서 열거형은 같은 부류에 속하는 요소들을 묶어서 표현할 수 있는 타입입니다. 다른 타입들과 다르게 한번 선언한 이후에는 추가하거나 수정이 불가합니다. 그래서 보통 정해진 범위
value-of-coding.tistory.com
'Language > Swift' 카테고리의 다른 글
Swift 클로저 (0) | 2021.03.11 |
---|---|
Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리] (0) | 2021.03.11 |
Swift 사용자 정의 타입 - Class (0) | 2021.03.11 |
Swift 사용자 정의 타입 - Struct (0) | 2021.03.11 |
Swift 옵셔널 (0) | 2021.03.11 |