[iOS-Swift] 타입캐스팅

TIL 11일 차 - Swift 문법 타입 캐스팅

타입 캐스팅이란?

이 객체의 진짜 타입이 뭔지 확인

이 타입으로 써도 되는 것인지 물어보기

 

타입캐스팅이 필요한 상황?

let animals; [Any] = ["모찌", 1, true]

이 animals 안에 String, Int, Bool 다 섞여있는데 스위프트는 모두 Any라고 받아들인다.

 

print(animals[0].count) // 에러 발생

왜 에러가 발생하냐면 animals의 0번째 인덱스의 값이 String인지 확신이 없기 때문임

 

이럴 때 타입캐스팅을 써야 한다!

 

let value: Any = "Hello"

if let text = value as? String {
	print(text.count)
}

// 해석: value가 String이면 text에 넣어서 print하고 아니면 nil

 

 

그리고 as!라는 것도 있는데

좀 극단적으로 얘는 무조건 이 타입이다. 틀리면 앱 죽어도 됨 그 정도임

let value: Any = "Hello"
let text = value as! String
// 만약 value가 String이 아니면 바로 앱 폭발함

 

 

is는 타입을 확인하는 용도

let value: Any = 10

if value is Int {
	print("value는 정수임")
}

// value가 정수이면 true라서 print문 실행 됨

 

 

 

 

클래스에서의 타입 캐스팅 이용하기

class Animal {}
class Dog: Animal {
    func bark() {
        print("멍멍멍뭉")
    }
}

let animal: Animal = Dog()

// animal.bark() 당연히 에러임
// 스위프트는 animal을 Animal로만 알고있음

if let dog = animal as? Dog {
    dog.bark()
}