swift의 타입 캐스팅은 instance의 타입을 확인하는 용도 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도이다.
class Person{
var name: String = ""
func breath(){
print("숨을 쉽니다")
}
}
class Student: Person{
var school: String = ""
func goToSchool(){
print("등교를 합니다")
}
}
class UniversityStudent: Student{
var major: String = ""
func goToMT(){
print("멤버십 트레이닝을 갑니다 신남!")
}
}
var dora: Person = Person()
var hana: Student = Student()
var jason: UniversityStudent = UniversityStudent()
var result: Bool
result = dora is Person
result = dora is Student
result = dora is UniversityStudent
result = hana is Person
result = hana is Student
result = hana is UniversityStudent
result = jason is Person
result = jason is Student
result = jason is UniversityStudent
if 와 switch 문에서 활용
if dora is UniversityStudent{
print("dora는 대학생입니다")
}else if dora is Student{
print("dora는 학생입니다")
}else if dora is Person{
print("dora는 사람입니다")
}
switch jason{
case is Person:
print("jason은 사람입니다")
case is Student:
print("jason은 학생입니다")
case is UniversityStudent:
print("jason은 사람도, 학생도, 대학생도 아닙니다")
}
많이 사용되지는 않으나, as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입 정보를 전환해 준다.
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
var jina: Any = Person()
as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴슷의 타입 정보를 전환해 준다.
// 조건부 다운 캐스팅
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent
optionalCasted = jina as? Universitystudent
optionalCasted = jina as? Student
//강제 다운 캐스팅
var forcedCasted: Student
var forcedCasted: Student()
optionalCasted = mike as! UniversityStudent
//활용
func doSomethingWithSwitch(someone: Person){
switch someone{
case is UniversityStudent:
(someone as! UniversityStudent).goToMT()
case is Student:
(someone as! Student).goToSchool()
case is Person:
(someone as! Person).breath()
}
}
doSomethingWithSwitch(someone: mike as Person)
doSomethingWithSwitch(someone: mike)
doSomethingWithSwitch(someone: jenny)