인스턴스의 "타입"을 확인 하거나, 변수나 객체의 타입을 다른 타입으로 변환하는 프로세스를 타입 캐스팅이라고 한다.
class Person{
}
class Student: Person{
}
class Teacher: Person{
}
let personA: Person = Person()
personA = Student() //가능
personA = Teacher() //가능
let studentA: Student = Student()
studentA = Person() //불가능
studentA = Teacher() //불가능
let teacherA: Teacher = Teacher()
teacherA = Person() //불가능
teacherA = Student() //불가능
is 연산자를 활용해 타입을 체크하고 비교 결과는 bool 타입으로 반환한다.
let str: String = "hello"
print(str is String) //true
print(str is Character) //false
result = personA is Person //true
result = personA is Student //false
result = personA is Teacher //false
result = studentA is Person //true
result = studentA is Student //true
result = studentA is Teacher //false
as 연산자를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다. Any 혹은 AnyObject로도 타입정보를 변환할 수 있다.
class Person {
var id = 0
var name = "name"
}
class Worker: Person {
var salary = 300
}
class Programmer: Worker{
var lang = "swift"
}
//업캐스팅
var ally: Worker = Programmer() as Worker //programmer인스턴스를 생성하여 person 행세를 할 수 있도록
print(ally.lang) //Value of type 'Worker' has no member 'lang'
print(ally.salary)
var ben: Any = Person()
위의 코드에서 ally를 worker로 보고 있기 때문에 lang에는 접근하지 못한다.
as? 또는 as! 를 사용하여 자식클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해준다.
as? 연산자는 런타임에 캐스팅이 실행된다. 캐스팅에 실패하면(캐스팅하려는 타입에 부합하지 않는 인스턴스라면) nil을 반환하기 때문에 결과의 타입은 옵셔널 타입이다.즉, 실패할 가능성이 있으면 as? 를 사용하는 것이 좋다.
let programmer1 = Programmer()
let worker1 = Worker()
let person1 = Person()
let worker2 = worker1 as? Worker //Worker
let worker3 = worker1 as? Person //Person
let worker4 = worker1 as? Programmer //nil
let person2 = person1 as? Person //Person
let person3 = person1 as? Worker //nil
let person4 = person1 as? Programmer //nil
let programmer2 = programmer1 as? Person //Person
let programmer3 = programmer1 as? Worker //Worker
let programmer4 = programmer1 as? Programmer//Programmer
if let person5 = programmer1 as? Programmer {
person5.lang //swift
}
if let person6 = worker1 as? Programmer {
person6.lang
}
as! 연산자는 런타임에 특정 타입으로 강제 캐스팅된다. 캐스팅에 실패하면, 런타임 오류가 발생한다. 캐스팅에 성공하면 성공한 인스턴스(일반 타입)를 반환한다.
let work1 = worker1 as! Person
let work2 = worker1 as! Worker
let work3 = worker1 as! Programmer //Error