오늘은 열거형에 대해서 학습해보도록 하겠습니다.
열거형에 대한 내용이 많이 언급되지만 확실하게 어떻게 사용하는지 왜 사용이 되는지 알아보도록 하겠습니다.
열거형
열거형은 "서로 관련된 데이터들을 묶어 나타내는 자료형"입니다.
열거형은 언제 사용될까?
- 제한된 선택지를 주고 싶을때
- 정해진 값 외에는 입력받고 싶지 않을 때
- 예상된 입력 값이 한정되어 있을 때
위에 사용하는 3가지 예시를 보면 선택의 범위를 한정한다는 공통점을 가지고 있습니다.
예를 들어 방위를 생각해보겠습니다.
방위에는 동쪽, 서쪽, 남쪽, 북쪽으로 네가지만 존재합니다. 하나를 골라야 한다면, 4가지 중 하나를 골라야 할 것입니다.
이것을 swift 열거형으로 표현해보겠습니다.
enum Azimuth {
case north
case south
case east
case west
}
/*
이렇게도 표현이 가능
enum Azimuth {
case north, south, east, west
}
*/
그리고 각 항목마다 다양한 형태의 실제 값을 가질 수도 있습니다.
enum Azimuth: String{
case north = "north"
case south = "south"
case east = "east"
case west = "west"
}
이렇게 선택의 범위를 한정하고 대응되는 값을 맵핑하게 된다면 문자열 입력의 실수를 줄일 수 있게 됩니다.
enum을 사용하기 좋은 예시
앞에서 말했듯이 범위가 정해져 있는 것이 좋습니다.
- 방위
- 오류 유형
실제로 오류 처리를할때 대부분의 오류들을 enum을 가지고 항목을 정해놓았습니다.
- 대학교의 학과
Raw value(원시 값)
여러가지 형태로 case마다 값을 할당할 수 있습니다.
enum Movie: Int{
case romance
case thriller
case action
case horror
}
print(Movie.horror.rawValue) // 3
raw value 타입을 결정하려면 enum 이름 옆에 타입을 정의해주면 됩니다. 위에 코드는 Int형태로 raw value를 정해주었습니다.
만약 따로 raw value의 값을 할당해주지 않는다면 숫자 0부터 순서대로 할당을 하게 됩니다.
enum Movie: Int{
case romance = 1
case thriller
case action
case horror
}
print(Movie.horror.rawValue) // 4
만약 첫번째 case에 정수값을 입력해 주었다면, 입력한 숫자 기준으로 차례대로 raw value가 일씩 증가한 값이 할당되게 됩니다.
enum Direction: String{
case north = "N"
case south = "S"
case east = "E"
case west //만약 raw value의 값을 할당하지 않게 된다면 case의 이름과 같은 값이 할당되게 됩니다.
}
print(direction.north.rawValue) // North
print(direction.west.rawValue) // west
문자열 타입 raw value를 선언해 주었습니다.
enum Direction: String{
case north = "N"
case south = "S"
case east = "E"
case west = "W"
}
print(Direction(rawValue: "N")!) // north
만약 raw value를 통해서 case를 참조하고 싶다면 rawValue 파라미터를 가진 생성자를 통해서 case를 참조할 수 있습니다.
Associated value(연관 값)
Associated value는 case에 관련해서 데이터를 추가함으로써 세부적인 정보를 전달이 가능하게 하는 값입니다.
날씨를 예로 들어 보겠습니다.
enum Weather{
case sunny
case windy(speed: Int)
case rainy(chance: Int, amount: Int)
func printWeatherInfo() {
switch self {
case .sunny:
print("맑음")
case .windy(let speed):
print("바람 \(speed)m/s")
case .rainy(let chance, let amount):
print("비 \(chance)% \(amount)mm")
}
}
}
let yesterdayWeather = Weather.windy(speed: 5)
let todayWeather = Weather.rainy(chance: 90, amount: 10)
let tomorrowWeather = Weather.sunny
yesterdayWeather.printWeatherInfo()//바람 5m/s
todayWeather.printWeatherInfo()//비 90% 10mm
tomorrowWeather.printWeatherInfo()//맑음
이렇게 날씨마다 세부적인 정보를 추가할 수 있습니다. 비가 오는 날씨를 의미하는 .rainy는 강수확률를 의미하는 파라미터 chance, 강수량을 의미하는 amount를 추가해주었습니다. 그리고 Weather 열거형에 함수를 추가하여 날씨 따른 출력을 다르게 설정하였습니다.
열거형 case 순회
모든 case들을 순회를 할 수 있게 Array 타입에 case들을 할당할 수 있습니다.
우선 해당 열겨형에서 CaseIterable을 채택해야합니다.
enum Direction: CaseIterable{
case north
case south
case east
case west
}
let allCase = Direction.allCases
for dir in allCase{
print(dir)
}
/*
출력:
north
south
east
west
*/
비교 가능한 열거형
Comparable을 채택하여 case를 가지고 선언된 case 순서를 기준으로 비교할 수 있습니다.
늦게 선언된 case가 더 높은 우선순위를 가지게 됩니다.
enum Condition: Comparable {
case bad
case soso
case good
}
let bad = Condition.bad
let soso = Condition.soso
let good = Condition.good
print(bad < soso)// true
print(soso < good)// true
print(good < bad)// false
'Swift🐤' 카테고리의 다른 글
swift) where 키워드 (0) | 2024.01.18 |
---|---|
Swift) 클래스 내부 메소드(method) 종류 (0) | 2023.10.10 |
Swift) Nested Function (0) | 2023.09.06 |
Swift) Property Observers(프로퍼티 옵져버) (0) | 2023.09.04 |
Swift) collection types(and tuple) (0) | 2023.09.04 |