오늘은 타입캐스팅에 대해서 알아보겠습니다.
타입캐스팅은 인스턴스의 타입을 확인하거나 인스턴스의 타입을 슈퍼클래스 또는 서브클래스 타입처럼 다루기 위해 사용합니다.
캐스팅은 실제 인스턴스 값을 바꾸는 것이 아니라 지정한 타입으로 취급하는 것입니다.
is
를 써서 타입을 확인할 수 있습니다.
아래 코드를 보면 is
를 사용하여 항목들의 타입을 확인한 후 count를 올립니다.
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]
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" 출력
as? 와 as!를 사용하여 인스턴스 타입을 확인할 수 있습니다. as?는 어떤 타입의 인스턴스인지 확실하지 않을 때 사용하고, as!는 확실할 때 사용합니다. 하지만 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