열거형은 특정 클래스나 구조체의 기능을 명확히 사용하기에 용이합니다. 그러나 굳이 클래스나 구조체 외부에서는 열거형을 사용할 필요가 없을 때도 있습니다.
스위프트는 타입 내부에 타입을 정의하고 구현할 수 있습니다. 이처럼 타입 내부에 새로운 타입을 선언해준 것을 중첩 타입이라고 부릅니다.
class 사람 {
enum 직업 {
case 백수, 개발자, 학생
}
var job: 직업 = .백수
}
class Student: 사람 {
enum 학력 {
case 초등학교, 중학교, 대학교
}
var school: 학력
init(school: 학력) {
self.school = school
super.init()
self.job = .학생
}
}
let personJob: 사람.직업 = .백수
let programmerJob: 사람.직업 = .개발자
let student: Student = .init(school: .중학교)
print(student.job)
print(student.school)
// 학생
// 중학교
여기서 직업이라는 타입은 사람 타입 내부에 있는 중첩 타입이기 때문에 사용하기 위해서는 사람.직업 처럼 직업 앞에 감싸진 타입을 앞에 적어주어야 합니다.
다른 예시를 하나 더 들어봅시다.
struct Sports {
enum GameType {
case 축구, 농구
}
var gameType: GameType
struct GameInfo {
var time: Int
var player: Int
}
var gameInfo: GameInfo {
switch self.gameType {
case .축구:
return GameInfo(time: 90, player: 11)
case .농구:
return GameInfo(time: 40, player: 5)
}
}
}
struct ESports {
enum GameType {
case online, offline
}
var gameType: GameType
struct GameInfo {
var location: String
var package: String
}
var gameInfo: GameInfo {
switch self.gameType {
case .online:
return .init(location: "www.naver.com", package: "LOL")
case .offline:
return .init(location: "제주", package: "SA")
}
}
}
let 농구: Sports = .init(gameType: .농구)
let eSports: ESports = .init(gameType: .offline)
print(농구.gameInfo)
print(eSports.gameInfo)
// GameInfo(time: 40, player: 5)
// GameInfo(location: "제주", package: "SA")
같은 이름의 데이터 타입이지만 각 구조체에 맞게 서로 다른 종류의 게임이 있으며 제공해야 하는 정보도 서로 다릅니다. 이렇게 이름이 같더라도 역할이 달라야 할 때, 유용합니다. 만일 GameType을 외부에 데이터 타입으로 만들었다면, SportsGameType, ESportsGameType 이런 식으로 길게 타입을 선언했어야 되겠죠.
자료 출처: 야곰 스위프트 프로그래밍 3판
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."