<aside> 💡 타입캐스팅이란 클래스 인스턴스 타입을 확인하거나, 클래스 인스턴스의 타입을 슈퍼클래스 또는 서브클래스 타입처럼 다루기 위해 사용한다.
is
와 as
연산자를 사용하여 구현함Cast
)하는 간단하고 표현적인 방법을 제공함먼저 알아볼것은 '타입 캐스팅을 사용하여 특정 클래스 인스턴스의 타입을 확인 가능' 부분이다.
클래스에서만 사용할 수 있다!
</aside>
인스턴스의 타입은 is
키워드를 사용해서 타입을 체크 하는 연산자로 반환값이 Bool
let char: Character = "A"
char is Character // true
char is String // false
let bool: Bool = true
bool is Bool // true
bool is Character // false
표현식이 Type의 subclass 인 경우에도 true
를 반환 →
Human 클래스를 Teacher이란 클래스가 "상속" 받을 경우, teacher이란 인스턴스는 Human 클래스의 서브 클래스이기 때문에, 이런 경우엔 Human으로 타입 체크를 해도 true
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 타입을 사용할 경우, 상속 관계가 아니어도 예외적으로 사용할 수 있다.
as 를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다.
Any와 AnyObject 로도 타입정보를 변환할 수 있다. 꼭 필요한 경우가 아니라면 생략해도 무방
class Human {
let name: String
init(name: String) {
self.name = name
}
}
class Teacher: Human { }
class Student: Human { }
let people: [Human] = [
Teacher.init(name: "김선생"),
Student.init(name: "박제자"),
Student.init(name: "유제자")