[Swift] 타입캐스팅

김태형·2023년 4월 15일
0

Swift

목록 보기
18/22
post-thumbnail

이번에는 타입캐스팅에 대해 작성하고자 한다.



타입캐스팅

우선 스위프트는 다른 언어에 비해 다른 타입끼리의 값 교환을 엄격히 제한함

  • 암시적 타입 변환을 허용하지 않음

타입캐스팅

  • 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인양 행세할 수 있는 방법으로 사용가능

  • 자식 클래스는 부모클래스인 척을 할 수 있음 → 부모 클래스의 특성을 가지고 있기 때문

    • Coffee는 Latte나 Americano의 특성을 가지고 있지 않지만,
      Latte나 Americano는 Coffee의 특성을 가지고 있다!
  • 데이터 타입 확인 is

    • is를 통해 인스턴스가 어떤 클래스의 인스턴스 타입인지 확인 가능
    • myCoffee는 Americano 타입이면서 Coffee 타입임
let myCoffee: Americano
let yourCoffee: Latte

coffee is Coffee    //true
coffee is Americano    //false
coffee is Latte    //false

myCoffee is Coffee    //true
myCoffee is Americano    //true

myCoffee is Latte    //false
yourCoffee is Latte    //true

다운캐스팅

  • 하지만 진짜 본인의 타입을 사용해야 할 때가 있음
  • 부모클래스의 타입을 자식클래스의 타입으로 캐스팅하여 다운캐스팅이라고 함

타입캐스트 연산자 as?!

  • 타입캐스트 연산자를 통해 다운캐스팅할 수 있음
  • 실패의 여지가 있기 때문에 옵셔널 타입
let actingConstant: Coffee = Latte(flavor: "vanilla", shot: 2)


if let actingOne: Americano = coffee as? Americano {
	print("This is Americano")
} else { 
	print(coffee.description)
}

//1 shot(s) coffee


if let actingOne: Americano = myCoffee as? Americano {
	print("This is Americano")
} else {
	print(coffee.description)
}

//This is Americano

Any, AnyObject의 타입캐스팅

  • 특정 타입을 지정하지 않고 여러 타입의 값을 할당할 수 있는 타입
  • Any : 함수 타입을 포함한 모든 타입, AnyObject : 클래스 타입만
  • 하지만 Any나 AnyObject는 전달받은 데이터가 어떤 타입인지 확인하고 사용해야 함!
    • 스위프트는 암시적 타입 변환은 허용하지 않으며, 타입에 굉장히 엄격하기 때문
func checkType(of item: AnyObject) {
	if item is Latte {
		print("item is Latte")
} else {
	print("Unknown Type")
}

checkType(of: coffee)    //Unknown Type
checkType(of: yourCoffee)    //item is Latte


오랜만에 공부하니 좀 어색한 것 같다.. 후다닥 1회독을 해야겠다.


[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌

0개의 댓글