[Swift] 타입 캐스팅

승아·2021년 9월 4일
0

부스트코스-iOS 프로그래밍을 위한 스위프트 기초

1. 스위프트 타입 캐스팅

  • 인스턴스의 타입을 확인 하는 용도
  • 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인 하는 용도

2. 타입 확인

  • is를 사용하여 타입을 확인한다.
class A {
  func a(){
    print("a")
  }
}

class B: A {
  func b(){
    print("b")
  }
}

class C: B {
  func c(){
    print("c")
  }
}

var a: A = A()
var b: B = B()
var c: C = C()

print(a is B) // false
print(b is A) // true
print(c is C) // true

3. 업 캐스팅

  • as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다.
  • Any 혹은 AnyObject로도 타입정보를 변환할 수 있다.
  • 암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방
var c: A = C() as A // 업캐스팅
// var c: C = A() as C // 오류
var a: Any = A() // as Any 생략 가능

4. 다운 캐스팅

as? 또는 as! 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해준다.

조건부 다운 캐스팅

  • as? 사용
  • 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환 -> 옵셔널 타입
var a = A()
var c: A = C() as A // 업캐스팅
var b: B?
b = c as? B
b = c as? C
b = a as? B // nil
b = a as? C // nil

강제 다운 캐스팅

  • as! 사용
  • 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 런타임 오류발생
  • 캐스팅에 성공하면 옵셔널이 아닌 일반 타입 반환
var a = A()
var c: A = C() as A // 업캐스팅
var b: B?
b = c as! B
b = c as! C
b = a as! B // 런타임 오류
b = a as! C // 런타임 오류

0개의 댓글