Swift & iOS

[Swift] 타입 캐스팅 (is, as)

hammii 2022. 6. 15. 21:56
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
반응형