스위프트에서 enum을 자주 활용하게 되어서 정리해보는 글입니다.
우선 Swift 공식문서 링크는 여기
Syntax
주소록 화면의 구성요소를 enum으로 표현해보자. 대충 네 가지 정도를 생각해봤는데 이름, 전화번호, 생일, 주소 정도를 넣으면 괜찮을 것 같다. 그러면 이 값들을 다음과 같이 enum으로 표현할 수 있다.
enum ContactInfo {
case name
case phoneNumber
case birthday
case address
}
enum의 이름은 대문자로 시작한다. case에 정의된 값들은 C나 Objective-C처럼 Int 값을 가지고 있지는 않다. 그냥 그 자체로 다른 값이다. 별도의 정수형이 없어도 Swift는 얘네가 다른 걸 안다. (Swift enumeration cases don’t have an integer value set by default, unlike languages like C and Objective-C.)
정수형 enum이나 string형 enum을 만들고 싶을 땐 다음과 같이 enum 이름 뒤에 :Int나 :String을 붙여서 rawValue 값을 사용하면 된다.
enum ContactInfo: Int {
case name = 0
case phoneNumber
case birthday
case address
}
enum ContactInfo: String {
case name
case phoneNumber
case birthday
case address
}
String의 경우 case name = "name" 과 같이 사용할 수도 있지만, 아무것도 안 쓰면 case 명이 바로 지정된다. case 값을 바로 출력해보면 아래와 같이 나오는 걸 확인할 수 있다. ContactInfo.name.rawValue로 출력해도 동일한 결과가 나온다.
rawValue를 사용해 값을 초기화 할 수 있다. 초기화에 성공하면 ContactInfo의 case 중 하나가 된다(optional). 초기화가 되지 않으면 nil이 된다.
만약 case를 한 줄에 쓰고 싶다면 ,로 구분해서 추가하면 된다.
enum ContactInfo {
case name, phoneNumber, birthday, address
}
변수에 값을 할당할 때는 ContactInfo.name 처럼 넣어주면 되는데, 변수의 타입이 명시적인 경우에는 .name만 써도 된다.
let name = ContactInfo.name
let phoneNumber: ContactInfo = .phoneNumber
Matching Enumeration Values with a Switch Statement
enum 타입은 switch와 쓸 일이 많이 생긴다. 각 case별로 동작을 다르게 해야하는 경우 유용하다. 만약 ContactInfo의 case 별로 이동해야 하는 화면을 결정해야 한다고 가정한다면 다음과 같이 사용할 수 있다.
let contactInfo = ContactInfo.name
switch contactInfo {
case .address:
print("주소 찾기 화면으로 이동")
case .birthday:
print("time picker 노출")
default:
print("화면 이동 없음")
}
contactInfo가 어떤 case인지에 따라 이동이 가능한 switch 구문이다. 만약에 case별로 지정하지 않아도 된다면 default로 들어가도록 설정한다.
Iterating over Enumeration Cases
enum에 CaseIterable을 사용하면 반복문도 아주 쉽게 된다. CaseIterable 프로토콜을 채택하면 allCases를 사용할 수 있게 된다. 아까 ContactInfo를 String으로 만들어 두고 반복문을 allCases로 돌렸을 때 String 값이 잘 나오는 것을 확인할 수 있다.
다음 게시글에서는 Associated Values(연관값)가 무엇인지 공부하고, 어떻게 활용할 수 있는지 정리할 예정이다.
'Swift' 카테고리의 다른 글
[iOS] Swift initialization 알아보기 (4) - Failable Init (0) | 2021.09.24 |
---|---|
[iOS] Swift initialization 알아보기 (3) - Designated Init, Convenience Init (0) | 2021.09.17 |
[iOS] Swift initialization 알아보기 (2) - 기본 생성자 (0) | 2021.09.17 |
[iOS] Swift initialization 알아보기 (1) - init 기초 (0) | 2021.09.15 |
[iOS] Swift Enum - Associated Values (0) | 2021.09.10 |