타입 중첩

피터·2022년 9월 26일
0
post-thumbnail

열거형은 특정 클래스나 구조체의 기능을 명확히 사용하기에 용이합니다. 그러나 굳이 클래스나 구조체 외부에서는 열거형을 사용할 필요가 없을 때도 있습니다.

스위프트는 타입 내부에 타입을 정의하고 구현할 수 있습니다. 이처럼 타입 내부에 새로운 타입을 선언해준 것을 중첩 타입이라고 부릅니다.

중첩 데이터 타입

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판

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
profile
iOS 개발자입니다.

0개의 댓글