<aside> 💡 타입캐스팅이란 클래스 인스턴스 타입을 확인하거나, 클래스 인스턴스의 타입을 슈퍼클래스 또는 서브클래스 타입처럼 다루기 위해 사용한다.

먼저 알아볼것은 '타입 캐스팅을 사용하여 특정 클래스 인스턴스의 타입을 확인 가능' 부분이다.

클래스에서만 사용할 수 있다!

</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: "유제자")