superclass
나 subclass
로 취급하는 방법입니다. 타입캐스팅에는 is
와 as
두 연산자를 사용합니다. 타입캐스팅을 이용하면 특정 프로토콜을 따르는지(conforms) 확인할 수도 있습니다.MediaItem
이라는 클래스를 선언했는데 이 클래스를 서브클래싱 해서 두개의 다른 서브클래스를 만들어 보겠습니다.MediaItem
클래스의 서브클래스 Movie
와 Song
두개의 클래스를 선언했습니다. 마지막으로 이 Movie
와 Song
두개의 클래스를 아이템으로 갖는 library
배열을 선언합니다.library
가 갖고 있는 Movie
,Song
인스턴스의 공통 부모는 MediaItem
이기 때문에 library
는 타입 추론에 의해 [MediaItem]
배열의 형을 갖게 됩니다. library
를 순회(iterate)하면 배열의 아이템은 Movie
, Song
타입이 아니라 MediaItem
타입이라는 것을 확인할 수 있습니다. 타입 지정을 위해서는 downcasting
을 이용해야 합니다.is
연산자를 이용해 특정 인스턴스의 타입을 확인할 수 있습니다. 아래 코드는 library
배열을 순회하고 아이템이 특정 타입일때마다 그 숫자를 증가하는 예제 코드입니다.as?
와 as!
연산자를 이용해 어떤 타입의 인스턴스인지 확인할 수 있습니다. as?
는 특정 타입이 맞는지 확신할 수 없을때 사용하고 as!
는 특정 타입이라는 것이 확실한 경우에 사용합니다. 단 as!
으로 다운캐스팅을 했는데 지정한 타입이 아니라면 런타임 에러가 발생합니다. 다음 예제는 library
배열의 mediaItem
이 Movie
인스턴스 일수도 있고 Song
인스턴스일 수도 있기 때문에 다운캐스팅을 위해 as?
연산자를 사용했습니다.NOTE 캐스팅은 실제 인스턴스나 값을 바꾸는 것이 아니라 지정한 타입으로 취급하는 것 뿐입니다.
Any
타입의 예제입니다. things
라는 Any
타입 배열을 선언해 여러 타입의 값을 저장합니다. 여기에는 Int
, String
, 함수, 클로저까지 포함됩니다.things
를 순회하며 타입캐스팅이 되는지 switch case
문에 as
연산자로 확인해 타입캐스팅 되는 배열의 원소의 값을 적절히 출력합니다.Int
, Double
뿐만 아니라 튜플, 함수도 Any
타입에 포함될 수 있다는 것을 확인할 수 있습니다.NOTEAny
타입은 옵셔널 타입을 포함합니다. 하지만 Swift에서는Any
타입을 사용해야 하는 곳에 옵셔널을 사용하면 경고를 발생 시킵니다. let optionalNumber: Int? = 3 things.append(optionalNumber) // 경고 things.append(optionalNumber as Any) // 경고 없음