Swift Language

Swift Language - 17 - 타입캐스팅 (Type Casting)

xnoag 2023. 2. 4. 09:31

타입캐스팅을 위한 클래스 계층구조 선언 (Defining a Class Hierarchy for Type Casting)

// 타입캐스팅의 동작을 확인하기 위해 클래스를 하나 만들어 보겠습니다.
class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}


// MediaItem이라는 클래스를 선언했는데 이 클래스를 서브클래싱 해서 두개의 다른 서브클래스를 만들어 보겠습니다.
class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}

class Song: MediaItem {
    var artist: String
    init(name: String, artist: String) {
        self.artist = artist
        super.init(name: name)
    }
}


// 마지막으로 이 Movie와 Song 두개의 클래스를 아이템으로 갖는 library배열을 선언합니다.
let library = [
    Movie(name: "Casablanca", director: "Michael Curtiz"),
    Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
    Movie(name: "Citizen Kane", director: "Orson Welles"),
    Song(name: "The One And Only", artist: "Chesney Hawkes"),
    Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
// the type of "library" is inferred to be [MediaItem]


//배열의 아이템은 Movie, Song 타입이 아니라 MediaItem타입이라는 것을 확인할 수 있습니다. 타입 지정을 위해서는 downcasting을 이용해야 합니다.

 

형 확인 (Checking Type)

// is연산자를 이용해 특정 인스턴스의 타입을 확인할 수 있습니다.
var movieCount = 0
var songCount = 0

for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}

print("Media library contains \(movieCount) movies and \(songCount) songs")
// "Media library contains 2 movies and 3 songs" 출력

 

다운캐스팅 (Downcasting)

// as?와 as!연산자를 이용해 어떤 타입의 인스턴스인지 확인할 수 있습니다.
//  다음 예제는 library배열의 mediaItem이 Movie 인스턴스 일수도 있고 Song인스턴스일 수도 있기 때문에 다운캐스팅을 위해 as?연산자를 사용했습니다.
for item in library {
    if let movie = item as? Movie {
        print("Movie: \(movie.name), dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: \(song.name), by \(song.artist)")
    }
}

// Movie: Casablanca, dir. Michael Curtiz
// Song: Blue Suede Shoes, by Elvis Presley
// Movie: Citizen Kane, dir. Orson Welles
// Song: The One And Only, by Chesney Hawkes
// Song: Never Gonna Give You Up, by Rick Astley

 

 

 

출처 https://jusung.gitbook.io/the-swift-language-guide/language-guide/18-type-casting