지난 글에서 encoding과 decoding을 진행할 때, do-catch, try를 사용했었다. do-catch문과 try는 오류 처리를 할 때 주로 사용하는 구문이다.
do {
try 오류 발생 가능 코드
} catch 오류 패턴 {
처리 코드
}
let person = Person(name: "John", age: 30)
let jsonEncoder = JSONEncoder()
do {
let jsonData = try jsonEncoder.encode(person)
if let jsonString = String(data: jsonData, encoding: .utf8) {
print("JSON 문자열: \(jsonString)")
}
} catch {
print("인코딩 에러: \(error)")
}
우연히도 아직 프로젝트에서 열거형을 사용해본적이 없어서 아직 어색한 친구다. 이번 기회에 기본적인 내용을 정리해보자 한다.
열거형은 서로 연관된 값들을 그룹화하고 명명된 상수로 나타내는 데 사용되는 강력한 데이터 유형이다. 즉, 이미 정해놓은 입력 값만 선택해서 받고 싶을 때 사용하면 효과적이다.
열거형은 enum
키워드를 사용해서 선언하면 된다.
enum CompassPoint {
case north
case south
case east
case west
}
열거형 내에서 각각의 값은 케이스라고 불린다. 위의 코드에서 north, south, east, west 모두 케이스이다. 선언을 할 때, 하나의 케이스 안에 나열해서 써도 된다.
enum CompassPoint {
case north, south, east, west
}
사용할 때는 하나의 자료형이 되는 것이서 타입처럼 사용하면 된다.
let direction: CompassPoint = .south
case에 원시값을 지정해줄 수 있는데, 이를 Raw Value라고 한다. Raw Value가 될 수 있는 자료형은 Number Type, Character Type, String Type, 총 3가지이다. 원시값을 가지고 싶다면, enum 선언할 때 Type을 꼭 명시해주어야 한다.
enum CompassPoint: Int {
case north = 1
case south
case east = 4
case west
}
Int 타입을 선언해주면 1씩 증가한 값들이 들어간다. south는 2, west는 5가 된다.
enum CompassPoint: Double {
case north = 1.0
case south
case east = 4
case west
}
그런데 Double이나 Float 타입으로 선언하고 값을 지정해주면 에러가 뜬다. 현재 north는 정수값이 아닌 실수값이기 때문에 정수인 1을 더하지 못하는 것이다. west는 정상적으로 5.0으로 출력이 될 것이다.
enum CompassPoint: Character {
case north = "n"
case south = "s"
case east = "e"
case west = "w"
}
Character을 타입으로 선언하면 모든 Raw Value를 선언해주어야 한다.
enum CompassPoint: String {
case north = "n"
case south
case east
case west = "w"
}
Raw Value를 지정하지 않으면, case 이름과 동일한 Raw Value가 자동으로 만들어진다.