본문 바로가기

DEV/Swift

[Swift] Type Casting (타입캐스팅)

인스턴스의 타입을 확인.

인스턴스를 부모/자식 클래스의 타입으로 사용할 수 있는지 확인.

is, as 사용

//생물 클래스
class Creature {
    var alive:Bool
    init(breath:Bool) {
        self.alive = breath
    }
    
}
//동물 클래스: 생물 클래스를 상속받음
class Animal: Creature {
    var name:String
    init(name:String, breath:Bool) {
        self.name = name
        super.init(breath: breath)
    }
}
//조류 클래스: 동물 클래스를 상속받음
class Bird: Animal {
    var canFly:Bool
    init(fly:Bool, name:String, breath:Bool) {
        self.canFly = fly
        super.init(name: name, breath: breath)
    }
}
//인스턴스 생성
var rose:Creature = Creature(breath: true)
var dog:Animal = Animal(name: "Doggu", breath: true)
var chicken:Bird = Bird(fly: false, name: "Chic", breath: true)

 

//타입 확인: 'is'를 사용해서 Bool 형식을 결과를 받음
//rose는 생물이지만 동물이 아니므로 값은 'false'
var result = rose is Animal

//업캐스팅: 'as'를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 타입정보 전환
//많이 쓰이진 않음. 암시적으로 처리되므로 생략해도 됨.
var wolf:Creature = Animal(name: "Pow", breath: true) as Creature

//다운캐스팅: 'as?' 또는 'as!'를 사용해 자식클래스에 사용하도록 타입정보를 알려줌.
//as?: 조건부 다운캐스팅
var optionalCast: Animal?
optionalCast = chicken as? Bird //Bird
optionalCast = dog as? Bird //nil
//as!: 강제 다운캐스팅
var forcedCast: Animal
forcedCast = chicken as! Bird   //bird
//forcedCast = dog as! Bird //error