IOS- 16

김정현·2023년 3월 24일
0

IOS 개발공부 일지

목록 보기
16/27

타입캐스팅

인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인양 행세할 수 있는 방법으로 사용할 수 있다.
is와 as연산자로 값의 타입을 확인하거나 다른 타입으로 전환할 수 있다.

데이터 타입 확인

is 연산자를 사용하여 인스턴스가 어떤 클래스의 인스턴스인지 타입을 확인해볼 수 있다.
인스턴스가 해당 클래스의 인스턴스거나 그 자식클래스의 인스턴스라면 true를 반환하고, 그렇지 않다면 false를 반환한다.

  • is 연산자는 클래스의 인스턴스뿐 아니라 모든 데이터 타입에 사용가능하다.
print(A is B)            //true or false

또, 메타타입 타입을 이용하여 타입을 확인할 수 있다. 메타타입 타입은 타입의 타입을 뜻한다. 타입자체가 하나의 타입으로 또 표현 가능하다는 것이다.
(.Type), 프로토콜 타입이라면 (.protocol)를 사용하여 메타타입을 표현할 수 있다.
또 (.self)를 사용하여 타입 자체를 값으로 반환 시킬 수 있다.

let stringtype: String.Type = String.self           //stringType에 메타타입을 이용

someType = stringType
print(someType)    //String

다운캐스팅

자식클래스보다 더 상위에 있는 부모클래스의 타입을 자식클래스의 타입으로 캐스팅한다고 해서 다운캐스팅이라고 한다.

  • as? 는 다운캐스팅이 실패했을 경우 nil을 반환한다. (옵셔널)
  • as! 는 다운캐스팅에 실패했을 경우 런타임 오류가 발생한다.

다운캐스팅을 확신할 수 있는 경우는 캐스팅하려는 타입이 같은 타입이거나 부모클래스 타입일 경우이다.

if let actingOne: Americano = coffee as? Americano 

위 코드는 "만약 coffee가 참조하는 인스턴스가 Americano타입의 인스턴스 라면 actiongOne이라는 임시 상수에 할당하라." 라는 뜻이다.

Any, AnyObject 타입캐스팅

특정 타입을 지정하지 않고 여러 타입의 값을 할당할 수 있는 특별한 타입이다.

  • Any는 함수 타입을 포함한 모든 타입을 뜻하고.
  • AnyObject는 클래스 타입만을 뜻한다.

0개의 댓글