[Swift] 스위프트 타입 캐스팅

chaaansooo·2022년 3월 4일
0

Swift 문법

목록 보기
2/4
post-thumbnail

swift로 코드를 작성할 때 다른 곳에서 값을 꺼내서 선언할 곳에 넣어줄 때가 있다.

let a = record.object(forKey: "key")

다음과 같이 선언하게 되면 object(forKey: "key")의 값이 무엇인지 컴파일러가 우리의 의도하는 형으로 인식하지 못할 수가 있다.
이때 사용되는 것이 타입 캐스팅(type casting: 형 변환)이다.
타입 캐스팅을 함으로써 컴파일러가 우리의 코드가 의도하는 값의 타입을 인식할 수 있도록 해준다

let a = record.object(forKey: "key") as! String

타입 캐스팅의 종류

타입 캐스팅에는 두가지 종류가 있다.
업캐스팅(upcasting)과 다운캐스팅(downcasting)

업캐스팅

업캐스팅은 특정 클래스의 객체가 상위 클래스들 중의 하나로 변형되는 것을 말한다.
as라는 키워드를 사용하여 수행되고, 이 변환이 성공할 것이라고 컴파일러가 알려줄 수 있으므로 보장된 변환(guaranteed conversion)이라고도 한다.

let myButton: UIButton = UIButton()

let myControl: myButton as UIControl

UIButton은 UIControl의 하위클래스이므로 업캐스팅이 될 수 있다.

다운캐스팅

다운캐스팅은 어떤 클래스에서 다른 클래스로 만드는 변환이 일어날 때 발생한다.
컴파일러가 이러한 변환의 오류를 잡아낸다는 보장이 없다.

다운캐스팅은 보통 어떤 클ㄹ래스에서 그 클래스의 하뤼 클래스로 변환하게 된다.
다운캐스팅은 as! 키워드를 사용하여 수행되고, 강제변환(forced conversion)이라고도 한다.

let myScrollView: UIScrollView = UIScrollView()

let myTextView: myScrollView as UITextView 

UIScrollView가 UITextView보다 상위 클래스이기 때문에 위와같이 선언하게 되면 오류가 나게 된다.
안정성에 문제가 있을 수 있기 때문인데 이때 강제변환을 통해서 변환을 시켜줄 수 있다. 하지만 위에서 말한 것처럼 강제변환을 했다고 해서 안정성은 보장받을 수 없다.

let myScrollView: UIScrollView = UIScrollView()

let myTextView: myScrollView as! UITextView 

이렇게 하면 이전과 같은 오류는 나지 않겠지만 실행 중에 충돌이 난다.
그럼 어떻게 해야 안전하게 다운캐스팅을 할 수 있을까?

옵셔널 바인딩

as?를 이용하여 옵셔널 바인딩을 해주면 된다.

let myTextView: myScrollView as? UITextView {
	print("success")
} else {
	print("fail")
}

타입 검사(type check)

타입 검사를 통해 오류를 방지할 수도 있다.
타입 검사는 is 키워드를 사용한다

if myScrollView is UIScrollView{
	//맞으면 실행
}
profile
악으로 깡으로 버티기

0개의 댓글