스위프트에는 타입 내부에 타입을 정의하고 구현할 수 있다. 이처럼 타입 내부에 새로운 타입을 선언해준 것을 중첩 타입(Nested Type)이라고 부른다.
타입 내부에 새로운 타입을 정의하고 싶다면, 자신의 정의 내부에 새로운 타입을 정의하고 구현해주기만 하면 된다.
24.1 중첩 데이터 타입
함수 중첩처럼 클래스 내부에 새 클래스, 클래스 내부에 새 구조체, 구조체 내부에 새 열거형 등의 타입을 중첩해서 타입 내부에 새 타입을 정의할 수 있다.
/*
코드 24-1. 중첩 데이터 타입 구현
*/
class Person {
enum Job {
case jobless, programmer, student
}
var job: Job = .jobless
}
class Student: Person {
enum School {
case elementary, middle, high
}
var school: School
init(school: School) {
self.school = school
super.init()
self.job = .student
}
}
let personJob: Person.Job = .jobless
let studentJob: Student.Job = .student
let student: Student = Student(school: .middle)
print(student.job) // student
print(student.school) // middle
[코드 24-1]에는 Person 클래스 내부에 중첩 데이터 타입으로 Job이라는 열거형 타입이 정의되어 있다. 또, Student 클래스 내부에는 중첩 데이터 타입으로 School 이라는 열거형 타입이 정의되어 있다. 중첩 데이터 타입을 사용할 때는 자신을 둘러싼 타입(자신이 속해 있는 타입)의 이름을 자신보다 앞에 적어줘야 한다.
예를 들어 Person 클래스 내부에 정의한 Job 타입을 나타내려면 Person.Job이라고 표현한다. 이 순서로 중첩된 타입이 정확히 어떤 역할을 위해 만들어졌는지 더욱 확실히 알 수 있다.
Job 열거형은 Person 내부에 정의되어 있지만 Person을 상속받은 Student 클래스의 중첩 데이터 타입으로도 취급할 수 있다. 그래서 Person.Job과 Student.Job이라는 표현은 동일하게 사용할 수 있다.
/*
코드 24-2. 같은 이름의 중첩 데이터 타입 구현
*/
struct Sports {
enum GameType {
case football, basketball
}
var gameType: GameType
struct GameInfo {
var time: Int
var player: Int
}
var gameInfo: GameInfo {
switch self.gameType {
case .basketball:
return GameInfo(time: 40, player: 5)
case .football:
return GameInfo(time: 90, player: 11)
}
}
}
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 GameInfo(location: "www.liveonline.co.kr", package: "LoL")
case .offline:
return GameInfo(location: "제주", package: "SA")
}
}
}
var basketball: Sports = Sports(gameType: .basketball)
print(basketball.gameInfo) // (time: 40, player: 5)
var sudden: ESports = ESports(gameType: .offline)
print(sudden.gameInfo) // (location: "제주", pakage: "SA")
let someGameType: Sports.GameType = .football
let anotherGameType: ESports.GameType = .online
// let errorIfYouWantIt: Sports.GameType = .online // 오류 발생
[코드 24-2]의 중첩 데이터 타입 구현을 보면 Sports 구조체와 ESports 구조체에 각 GameType과 GameInfo가 있다. 이름이 같은 데이터 타입이지만 각 구조체에 맞게 서로 다른 종류의 게임이 있으며 제공해야 하는 게임 정보도 서로 다르다.
이와 같이 목적에 따라 타입을 중첩 하는 것은 타입의 목적성을 명확히 하는 데 큰 도움이 된다.
'iOS > SWIFT' 카테고리의 다른 글
[Swift] Chapter 26. where 절 (0) | 2021.10.23 |
---|---|
[Swift] Chapter 25. 패턴 (0) | 2021.10.23 |
[Swift] Chapter 23. 프로토콜 지향 프로그래밍 (0) | 2021.10.13 |
[Swift] Chapter 22. 제네릭 (0) | 2021.10.13 |
[Swift] Chapter 21. 익스텐션 (0) | 2021.10.11 |
댓글