- 인스턴스의 타입 확인
- 특정 타입으로 선언된 값을 다른 타입으로 변환하는 것
class Vehicle {
var currentSpeed = 0.0
func accelerate() {
self.currentSpeed += 1
}
}
class Car: Vehicle {
var gear: Int {
return Int(self.currentSpeed/20)+1
}
func wiper() {
//창 닦기
}
}
let trans: Vehicle = Car()
let car: Car = Vehicle() //error
✏️ 상수 trans
는 Car
클래스의 인스턴스를 할당받지만, Vehicle
타입으로 선언될 수 있음
- 비교 연산자 is 사용
- 할당된 값을 비교하는 것이 아니라 타입이 일치하는지 여부를 비교 -> Bool 반환
인스턴스(또는 변수, 상수) is 비교대상 타입
✏️ 연산자 왼쪽 인스턴스의 타입이 오른쪽 비교대상 타입과 일치하면 true
✏️ 연산자 왼쪽 인스턴스의 타입이 오른쪽 비교대상 타입의 하위 클래스일 경우 true
✏️ 그외의 경우는 false
SUV() is SUV //true
SUV() is Car //true
SUV() is Vehicle //true
Car() is Vehicle //true
Car() is SUV //false
let myCar: Vehicle = SUV()
if myCar is SUV {
print("myCar은 SUV 타입이다.")
} else {
print("myCar은 SUV 타입이 아니다.")
}
//myCar은 SUV 타입이다.
객체 as 변환할 타입
let anyCar: Car = SUV()
let anyVehicle = anyCar as Vehicle
✏️ Car
타입을 Vehicle
타입으로 캐스팅
✏️ 업캐스팅에 해당하므로, 오류는 발생하지 않음
객체 as? 변환할 타입(결과는 옵셔널 타입)
객체 as! 변환할 타입(결과는 일반 타입)
if let anySUV = anyCar as? SUV {
print("캐스팅이 성공하였습니다.")
}
✏️ Car
타입을 SUV
타입으로 캐스팅
✏️ 옵셔널 타입으로 반환되므로 옵셔널 해제해 주기
let anySUV = anyCar as! SUV
print("캐스팅이 성공하였습니다.")
✏️ 다운 캐스팅이 반드시 성공할 것이라는 확신이 있다면, 강제 캐스팅 구문을 사용해도 됨
AnyObject와 Any 타입을 사용하면, 상속 관계에 있지 않아도 타입 캐스팅할 수 있음
- 클래스의 일종
- 모든 종류의 클래스 타입을 저장할 수 있음
- AnyObject는 항상 다운 캐스팅만 수행할 수 있음
var allCar: AnyObject = Car()
allCar = SUV()
클래스에 국한되지 않고 스위프트에서 제공하는 모든 타입을 허용
var value: Any = "Sample String"
value = 3
value = false
value = [1,3,5,7,9]
value = {
print("함수가 실행됩니다.")
}
A. 그러면 그냥 전부 다 Any 쓰면 되는 거 아냐? 🤔
B. Any는 매우 극단적으로 추상화되어 있어서, Any 타입이 할당된 객체가 사용할 수 있는 프로퍼티나 메서드는 제공 ❌
그리고, Any 타입을 사용하면, 실제로 값이 할당되는 시점에 타입이 정해진다. 실행하기 전에는 타입을 알기 어려워 컴파일러가 오류를 잡아내지 못함!
출처)
꼼꼼한 재은씨의 스위프트: 문법편