타입캐스팅 : 인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼클래스나 서브클래스로 취급하는 방법
is : 타입을 체크해서 Bool타입으로 리턴한다.
as? : 조건부형식, 다운캐스팅하려는 타입의 옵셔널값으로 반환한다.
as! : 강제형식, 강제로 언래핑하여 값을 반환, 항상 성공할 것 이라고 확신 할 때만 사용해야하며 성공하지 못할 시 런타임 에러가 발생하면서 프로그램이 강제 종료된다.
코드로 확인
import Foundation
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
class Movie: MediaItem {
var directer: String
init(name: String, directer: String) {
self.directer = directer
super.init(name: name)
}
}
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
let library = [ // library: [mediaItem]
Movie(name: "기생충", directer: "봉준호"),
Song(name: "Butter", artist: "BTS"),
Movie(name: "올드보이", directer: "박찬욱"),
Song(name: "wonderwall", artist: "Oasis"),
Song(name: "Rain", artist: "이적")
]
var MobieCount = 0
var SongCount = 0
for item in library { //해당 인스턴스가 특정 클래스와 같은 타입이면 변수가 1씩 증가
if item is Movie {
MobieCount += 1
}
else if item is Song {
SongCount += 1
}
}
print("Media library contains \(MobieCount) movies and \(SongCount) Songs") //출력
for item in library { //해당 인스턴스가 특정 클래스로 다운캐스팅이 될 수 있다면
if let movie = item as? Movie { //그 클래스에 맞는 형식으로 출력
print("Movie: \(movie.name), dir. \(movie.directer)")
} else if let song = item as? Song {
print("Song: \(song.name), by \(song.artist)")
}
}
----------------------------------------------------------------------------
Media library contains 2 movies and 3 Songs
Movie: 기생충, dir. 봉준호
Song: Butter, by BTS
Movie: 올드보이, dir. 박찬욱
Song: wonderwall, by Oasis
Song: Rain, by 이적
End