스위프트의 타입캐스팅은 다음을 할 수 있는 것을 의미한다.
타입 확인 연산자(is)를 사용해서 인스턴스가 어떤 클래스의 인스턴스인지 타입을 확인할 수 있다. true/false를 반환한다. 클래스의 인스턴스에 주로 사용된다.
클래스 타입, 구조체 타입, 열거형 타입, 프로토콜 타입 등의 타입이다. 타입 자체를 하나의 타입으로 표현. 사실 클래스, 구조체, 열거형은 타입의 이름이다. 타입으로써의 정체성(meta type)을 드러내기 위해서는 .Type을 붙인다. 프로토콜은 .Protocol라고 붙인다.
SomeClass.Type
SomeProtocol.Protocol
self를 사용해서 타입을 값처럼 표현할 수 있다. 예를 들어 SomeClass.self라고 표현하면 SomeClass의 인스턴스가 아니라 SomeClass 타입을 값으로 표현한 값을 반환한다. SomeProtocol.self는 SomeProtocol을 준수하는 타입의 인스턴스가 아니라 SomeProtocol을 값으로 표현한 값을 반환한다.
런타임시에 타입을 확인하려면 type(of:) 사용한다.
let intType = Int.Type = Int.self
let myProtocol = SomeProtocol.Protocol = SomeProtocol.self
var somType: AnyType
someType = intType
print(someType) // Int
type(of: coffee) == Coffee.self
다음과 같이 어떤 클래스 타입의 변수 또는 상수가 정말로 해당 클래스의 인스턴스를 참조하지 않을 수도 있다.
// Coffee라는 타입의 상수가 Coffee 클래스의 인스턴스를 참조하고 있지 않다.
let myCoffee: Coffee = Latte(flavor: "vanilla")
이 때 아무리 myCoffee가 Latte 인스턴스를 가지고 있다고 하더라도 타입은 Coffee이기에 Latte 타입을 사용해야 하는 곳에서는 무용지물이다. 이를 위해 해당 상수의 타입을 변환해줘야 한다. 이를 다운캐스팅이라 한다.
클래스의 상속 모식도에서 부모클래스의 타입을 자식 클래스의 타입으로 캐스팅한다고 해서 다운 캐스팅
캐스팅은 인스터스 수정 X, 값 변경 X 메모리에는 똑같이 남아있다.
다만, 인스턴스를 사용할 때 어떤 타입으로 다루고 접근해야 하는지 판단할 수 있도록 컴퓨터에 힌트 제공!
특정 타입을 지정하지 않고 여러 타입의 값을 할당할 수 있는 Any (함수를 포함한 모든 타입), AnyObject(클래스 타입만 의미) → 다운캐스팅 해서 타입에 맞게 사용해야 한다.
옵셔널 타입도 Any로 표현 가능. 그런데도 Any 자리에 옵셔널을 쓰면 컴파일러 경고... 이 때는 명시적으로 as Any로 해주면 경고가 없어진다.