본문 바로가기
Swift 문법

스위프트 타입 캐스팅 as 업캐스팅(upcasting) as! as? 다운캐스팅(downcasting)

by 정석 지향 2020. 9. 10.
반응형

as로 upcasting

 

상속 관계가 있는 클래스들끼리만 타입 캐스팅 가능

스위프트 코드를 작성하다 보면 컴파일러가 특정 타입의 값을 식별할 수 없는 경우가 발생할 수 있음

이것은 애매모하거나 기대하지 않은 타입의 값이 메서드 또는 함수 호출에서 반환될 때 종종 발생

이런 경우에 as 연산자를 이용한 타입 변환(type casting)

  • 자식인스턴스 as 부모클래스 // upcasting 안전한 캐스팅, 자식이 추상화됨
  • 업캐스팅은 특정 클래스의 객체를 상위 클래스의 객체로 형 변환
  • UIButton은 UIControl의 하위 클래스이므로 다음과 같이 안전하게 형 변환
  • let myButton : UIButton = UIButton()
  • let mtControl = myButton as UIControl // 자식인스턴스 as 부모 클래스
  • 자식인스턴스인 myButton을 부모 클래스형으로 형 변환

as! as?로 downcasting

 

다운캐스팅은 어떤 클래스에서 다른 클래스로 변환할 때 안전한 변환을 보장할 수 없으며, 컴파일러가 유효하지 않은 변환 시도를 잡아낼 수도 있음

다운캐스팅에서 유효하지 않은 형 변환이 이뤄졌는데 컴파일러가 에러를 잡지 않았다면, 런타임에서 에러가 발생

다운 캐스팅은 주로 자식 클래스들 중에 하나로 변환하는 데 사용

성공 확신이 있으면 as! 키워드를 사용하며 강제 변환(forced conversion)

  • 변환이 안되면 crash

성공 확신이 없으면 as?를 사용하여 안전하게 변환

  • 변환이 안되면 nil을 리턴하므로 옵셔널 타입으로 변환함
  • 부모인스턴스 as! 자식 클래스 // downcasting 일반 타입으로 반환, 다운캐스팅이 반드시 성공할 것이라는 확신이 있을 때
  • 부모인스턴스 as? 자식 클래스 // downcasting 옵셔널 타입으로 반환, 오류 가능성 있을 경우

Xcode Playground 실행화면

 

반응형