새소식

iOS/Swift

[기본문법]타입캐스팅

  • -

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

 

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

'iOS > Swift' 카테고리의 다른 글

[기본문법] 프로토콜  (0) 2022.12.28
[기본문법]assert와 guard  (0) 2022.12.21
[기본문법] 상속  (0) 2022.12.16
[기본문법]클래스와 구조체 비교  (0) 2022.12.14
[기본문법] 프로퍼티  (0) 2022.10.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.