23-06-07
메서드나 함수가 반환하는 값이 불명확하거나 예상되지 않은 타입의 값일때, 컴파일러가 어떤 값의 특정 타입을 식별하지 못하는 경우가 있다.
이럴 때는 as 키워드를 사용하여 컴파일러에게 의도하는 타입을 제시한다.
이를 타입 캐스팅(type casting, 형 변환)이라고 한다.
다음은 object(forKey:) 메서드가 반환하는 값을 String타입으로 처리해야 한다고 컴파일러에게 알려주는 코드 예시이다.
let myValue = record.object(forKey: "comment") as! String
타입 캐스팅에는 업캐스팅(upcasting)과 다운캐스팅(downcasting)이 있다.
특정 클래스의 객체가 상위클래스중 하나로 변형되는 것을 말한다.
let myButton: UIButton = UIButton()
let myControl = myButton as UIControl
자식 클래스는 부모 클래스를 상속받기 때문에, 업캐스팅은 당연하게도 항상 성공한다.
업캐스팅과 달리, 주로 부모 클래스가 자식 클래스를 받아올 때 다운캐스팅을 사용한다.
일반적으로 부모 클래스가 자식 클래스인 척을 할 수 없기에, 업캐스팅과 같이 as를 사용하면 다운캐스팅에 실패한다.
이럴 때, as!를 사용하여 강제적으로 다운캐스팅 할 수 있다.
let myTextView = myScrollView as! UITextView
as!를 사용하면 에러 없이 컴파일된다. 그러나 실행 도중에 충돌이 발생할 수 있어, 강제 다운캐스팅은 주의하여 사용해야 한다.
as?와 옵셔널 바인딩을 사용해 더 안전하게 다운캐스팅 할 수 있다.
if let myTextView = myScrollView as? UITextView{
print("Type cast to UITextView succeeded")
} else {
print("Type cast failed")
}
연산자 is는 Bool을 반환한다.
if myobject is MyClass {
// myobject는 MyClass의 인스턴스다 -> True or False
}
📚 참고도서
[SwiftUI 기반의 iOS 프로그래밍]