=> 변수나 객체의 타입을 다른 타입으로 변환하는 프로세스
is
타입을 체크하는 연산자로 비교결과로 bool타입을 반환
let char: Character = "A"
print(char is Character) // true
print(char is String) // false
as
컴파일 단계에서 캐스팅이 실행되므로 타입 캐스팅이 성공할 경우에만 사용할 수 있다.
캐스팅에 실패할 경우 에러가 발생한다.
캐스팅하려는 타입이 같은 타입이거나 수퍼클래스 타입이라는 것을 알 때 사용한다.
as?
런타임에 캐스팅이 실행된다. 성공하면 옵셔널 타입의 인스턴스를 반환하고 실패하면 nil을 반환한다. 실패 가능성이 있다면 as?를 사용하는 것이 좋다.
as!
런타임에 특정타입으로 강제 캐스팅한다. 강제 타입 캐스팅에 실패할 경우 에러가 발생할 수 있고 성공한 경우 인스턴스를 반환한다.(옵셔널 아님)
class Person {
var id = 0
var name = "name"
}
class Worker: Person {
// id
// name
var salary = 300
}
class Programmer: Worker {
// id
// name
// salary
var lang = "Swift"
}
// 업캐스팅
let person1 = Person()
let worker1 = Worker()
let programmer1 = Programmer()
let personList = [person1,worker1] // Person타입으로 인식. 즉 업캐스팅되었음
personList[1].name
personList[1].salary // Person타입으로 보고 있기 때문에 salary에 접근하지 못함
// 다운캐스팅 - as? / as!
// as?
let pro = programmer1 as? Programmer // 타입변환이 안 될 수도 있기 때문에 옵셔널 리턴
if let person2 = programmer1 as? Programmer {
person2.lang
}
if let person3 = worker1 as? Programmer {
person3.lang
}
// as!
let pro2 = worker2 as! Programmer // Error: 타입변환 실패 시 오류