인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼 클래스나 서브 클래스로 취급하는 방법
class MediaItem {
var name : String
init(name: String) {
self.name = name
}
}
MediaItem
클래스를 서브클래싱 해서 두개의 다른 서브클래스를 만든다.
class Moive : 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")
]
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 ("영화 갯수 : \(movieCount), 노래 갯수 : \(songCount)") // 영화 갯수 : 2, 노래 갯수 : 3
특정 클래스 타입의 상수나 변수는 특정 서브클래스의 인스턴스를 참조하고 있을 수 있다.
as?
와 as!
연산자를 통해 어떤 타입의 인스턴스인지 확인할 수 있다.
as?
-> 특정 타입이 맞는지 확신할 수 없을 때 사용
as!
-> 특정 타입이 맞는지 확신할 때 사용 (만약 지정한 타입이 아니라면 런타임 에러가 발생하니 주의)
for item in library{
if let movie = item as? Movie {
print("영화 제목 : \(movie.name), 감독 : \(movie.director)")
} else if let song = item as? Song {
print("노래 제목 : \(song.name), 창작자 : \(song.artist)")
}
}
/*
영화 제목 : Casablanca, 감독 : Michael Curtiz
노래 제목 : Blue Suede Shoes, 창작자 : Elvis Presley
영화 제목 : Citizen Kane, 감독 : Orson Welles
노래 제목 : The One And Only, 창작자 : Chesney Hawkes
노래 제목 : Never Gonna Give You Up, 창작자 : Rick Astley
*/