1. 타입 캐스팅
- 인스턴스 타입을 확인 하는 용도 또는 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도
- is, as 사용
2. 예제를 위한 클래스 정의
class Person {
var name: String = ""
func breth() {
print("숨을 쉽니다")
}
}
class Student: Person {
var school: String = ""
func goToSchool() {
print("등교를 합니다")
}
}
class UniversityStudent: Student {
var major: Stirng = ""
func goToMT() {
print("멤버쉽 트레이닝을 갑니다")
}
}
var me: Person = Person()
var jimin: Student = Student()
var winter: UniversityStudent = UniversityStudent()
2. 타입 확인
var result: Bool
result = me is Person
result = me is Student
result = me is UniversityStudent
result = jimin is Person
result = jimin is Student
result = jimin is UniversityStudent
if me is UniversityStudent {
print("대학생")
} else if me is Student {
print("학생")
} else if me is Person {
print("사람")
}
switch jimin {
case is Person:
print("사람")
case is Student:
print("학생")
case is UniversityStudent:
print("대학생")
default:
print("모두 아님")
}
3. 업 캐스팅
- as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보 전환
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
var jina: Any = Person()
4. 다운 캐스팅
- as? 또는 as! 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스 타입정보를 전환
- 조건부 다운 캐스팅 : as? 를 사용 / 캐스팅에 실패시 nil 반환
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent
optionalCasted = jina as? UniversityStudent
optionalCasted = jina as? Student
- 강제 다운 캐스팅 : as! 를 사용 / 캐스팅에 실패시 런타임 오류 발생 / 캐스팅 성공시 옵셔널이 아닌 일반 타입 반환
var forcedCasted: Student
forcedCasted = mike as! UniversityStudent
5. 활용 코드
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)
doSomethingWithSwitch(someone: me)
func doSomething(someone: Person) {
if let universityStudent = someone as? UniversityStudent {
universityStudent.goToMT()
} else if let student = someone as? Student {
student.goToSchool()
} else if let person = someone as? Person {
person.breath()
}
}
doSomething(someone: mike as Person)
doSomething(someone: mike)
doSomething(someone: jenny)
doSomething(someone: me)