[Swift] 타입 캐스팅

ds-k.mo·2022년 4월 29일
0

Swift

목록 보기
12/22

타입 캐스팅

인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼 클래스나 서브 클래스로 취급하는 방법

서브 클래싱

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)
    }
}

MovieSong 클래스를 아이템으로 갖는 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")
]

형 확인 (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 ("영화 갯수 : \(movieCount), 노래 갯수 : \(songCount)") // 영화 갯수 : 2, 노래 갯수 : 3

다운캐스팅 (Downcasting)

특정 클래스 타입의 상수나 변수는 특정 서브클래스의 인스턴스를 참조하고 있을 수 있다.
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
*/

0개의 댓글