Swift 코드를 작성할 때 컴파일러가 어떤 값의 특정 타입을 식별하지 못하는 경우가 발생할 것이다.
이런 경우는 메서드나 함수가 반환하는 것이 불분명하거나 예상되지 않은 타입의 값일 때 종종 발생한다.
이럴 때는 as 키워드를 사용하여 코드가 의도하는 값의 타입을 컴파일러가 알 수 있게 해야 한다. (타입 캐스팅 = 형 변환)
object(forkey:) 메서드가 반환하는 값을 String 타입으로 처리해야 한다고 컴파일러에게 알려줘야 한다면..
let myValue = record.object(forKey: "comment") as! String
타입캐스팅의 두 가지 형태 중 하나
특정 클래스의 객체가 상위 클래스들 중의 하나로 변형되는 것
as 키워드를 사용해, 이러한 변환은 성공할 것이라고 줌 -보장된 변환(guaranteed conversion)
let myButton: UIButton = UIButton()
let myControl = myButton as UIControl
타입캐스팅의 두 가지 형태 중 또 다른 하나
어떤 클래스에서 다른 클래스로 만드는 변환이 일어날 때 발생한다.
안전하게 수행된다거나 유효하지 않은 변환 시도를 컴파일러가 잡아낼 것이라는 보장을 할 수 없다.
컴파일러가 발견하지 못했다면, 대부분의 경우 런타임에서 에러가 발생할 것이다.
as!를 사용하여 그 클래스의 하위 클래스로 변환 -강제 변환(forced conversion)
let myScrollView: UIScrollView = UIScrollView()
let myTextView = myScrollView as UITextView // x
'UIScrollView' is not convertible to 'UITextView'
(이 변환의 안정성을 보장할 수 없다)
as?를 사용한 옵셔널 바인딩을 사용하면 더 안전하다.
let myScrollView: UIScrollView = UIScrollView()
if let myTextView = myScrollView as? UITextView {
print("Type cast to UITextView succeeded")
} else {
print("Type cast to UITextView failed")
}
is 키워드를 사용하여 타입 검사를 할 수도 있다.
다음의 코드는 MyClass라는 이름의 클래스의 인스턴스인지를 검사하는 코드다.
if myObject is MyClass {
// myObject는 MyClass의 인스턴스다.
}