728x90
반응형
타입 캐스팅이란?
인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼 클래스나 서브 클래스로 취급하는 방법
1. is
인스턴스의 타입을 확인한다.
2. as
- as?
- 조건부 형식
- 다운 캐스팅하려는 옵셔널 값으로 반환
- as!
- 강제 형식
- 강제로 언래핑하여 값을 반환
- 따라서 반드시 성공할 것이라는 확신이 들 때만 사용해야 한다
3. is와 as의 예시
MediaItem을 정의하고 이를 상속받는 Movie, Song 클래스를 정의한다.
그 후 library 변수에 Movie와 Song 들을 넣어준다.
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
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)
}
}
let library = [
Movie(name: "기생충", director: "봉준호"),
Song(name: "Butter", artist: "BTS"),
Movie(name: "올드보이", director: "박찬욱"),
Song(name: "Wonderwall", artist: "Oasis"),
Song(name: "Rain", artist: "이적")
]
is 연산자를 사용하여 library 내에 있는 item의 타입을 확인한다.
Movie인지 Song인지 판단하여 movieCount, songCount를 증가시켜준다.
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 연산자를 사용하여 타입 캐스팅하여 정보들을 출력한다.
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: 기생충, dir. 봉준호
Song: Butter, by BTS
Movie: 올드보이, dir. 박찬욱
Song: Wonderwall, by Oasis
Song: Rain, by 이적
*/
출처: [패스트캠퍼스] 30개 프로젝트로 배우는 iOS 앱 개발 with Swift 초격차 패키지 Online.
728x90
반응형