TypeCasting
타입 캐스팅은 인스턴스의 타입을 확인 하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급한다
또한 프로토콜의 적합여부 확인도 가능하다.
is
let str: String = "hong"
str is String // true
str is Int // false
let bool: Bool = true
bool is Bool // true
bool is Character
클래스의 상속을 받은 경우에도 사용할 수 있다
class Human {
let name: String
init(name: String) {
self.name = name
}
}
class Teacher: Human { }
class Student: Human { }
let teacher = Teacher()
teacher is Teacher // true
teacher is Human // true
is로 해당타입을 확인하여 일치하면 true 일치하지 않으면 false를 반환한다.
as, as?, as!
인스턴스의 타입을 확인하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급할 때 사용한다
as연산자는 컴파일 단계에서 캐스팅이 실행되기 때문에 타입 캐스팅이 성공할 경우에만 사용할 수 있다
캐스팅 실패시 에러가 발생하며 캐스팅하려는 타입이 같은 타입이거나 슈퍼 클래스 타입이라는것을 알고 있을때 as를 사용한다
class Human {
var name: "name"
var age: 0
var email: "email"
}
class Teacher: Human {
var subject = "math"
}
class Student: Human {
var score: 0
}
let human1 = Human()
let teacher1 = Teacher()
let student1 = Student()
let humanList = [human1, teacher1, student1]
huumanList생성시 human1, teacher1, student1의 공통클래스인 Human타입으로 upcasting된다
upcasting
서브 클래스인스턴스를 상위클래스타입으로 참조한다!
**자식인스턴스 as 부모클래스 --> 부모클래스로 형변환 (업캐스팅)
downcasting
다운캐스팅은 어떤 클래승서 다른 클래스로 변환할 때 안전한 변환을 보장할 수 없으면 컴파일러가 유효하지 않은 변환 시도를 잡아낼 수도 있다
슈퍼 클래스 인스턴스를 "서브 클래스의 타입"으로 참조한다
업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용한다
다운 캐스팅은 실패할 수있기에 as?, as! 연산자를 이용한다
downcasting사용예시
class Human {
var name: "name"
var age: 0
var email: "email"
}
class Teacher: Human {
var subject = "math"
}
class Student: Human {
var score: 0
}
let human1 = Human()
let teacher1 = Teacher()
let student1 = Student()
if let teacher1 as? Student {
print(teacher1.subject) //downcasting이 되지않아 출력xx
}
let teacher2: Teacher? = human1 as? Teacher // nil을 리턴
let teacher2: Teacher = human1 as! Teacher // 런타임 에러!!!