타입 캐스팅은 인스턴스의 Type을 확인 하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법이다.
Swift에서 타입 캐스팅은 is나 as연산자로 구현하며, 타입 캐스팅을 사용하여 타입이 프로토콜에 적합한지 여부도 확인할 수 있다.
표현식 is Type
타입을 체크하는 연산자로, 런타임 시점에 실제 체크가 이루어 진다.
표현식이 Type과 동일하거나, 표현식이 Type의 서브 클래스인 경우 true 이 외의 경우엔 false를 반환한다.
let char: Character = "A"
char is Character // true
char is String // false
let bool: Bool = true
bool is Bool // true
bool is Character // false
class Human { }
class Teacher: Human { }
let teacher: Teacher = .init()
teacher is Teacher // true
teacher is Human // true
표현식 as (변환 할)Type
표현식 as? (변환 할)Type
표현식 as! (변환 할)Type
표현식(의 타입)이 변환할 Type과 호환된다면, 변환할 Type으로 캐스팅된 인스턴스를 리턴한다. 상속관계인 업캐스팅(Upcasting)과 다운 캐스팅(Downcasting)에서 사용한다.
Any와 AnyObject 타입을 사용할 경우, 상속 관계가 아니어도 예외적으로 사용할 수 있다.
1. 업캐스팅(Upcasting)
서브 클래스 인스턴스를 슈퍼 클래스의 타입으로 참조한다.
업 캐스팅은 항상 성공한다.
as 연산자를 사용해서 할 수도 있다.(컴파일 시점에 캐스팅 가능 여부를 결정한다)
class Human {
let name: String
init(name: String) {
self.name = name
}
}
class Teacher: Human { }
class Student: Human { }
//Student와 Teacher를 Human이란 클래스로 업캐스팅 해서 묶음.
let people: [Human] = [
Teacher.init(name: "김선생"),
Student.init(name: "박제자"),
Student.init(name: "유제자")
]
//as 를 통한 업캐스팅
let human = Teacher.init() as Human
2. 다운캐스팅(Downcasting)
슈퍼 클래스 인스턴스를 서브 클래스의 타입으로 참조한다.
업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용한다.
다운 캐스팅은 실패할 수 있기에 as?,as! 연산자를 사용한다.
let human = Teacher.init() as Human // 업캐스팅
var teacher: Teacher = human as! Teacher // 다운캐스팅
var teacher: Teacher = human as? Student // nil
참조
개발자 소들이