공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이번 포스팅에서는 타입 캐스팅에 대해서 공부하는데요.
다른 언어에서는 캐스팅이라고 하면 강제 타입 변환을 생각하는데요.
스위프트에서 타입 캐스팅을 다른 개념입니다.
스위프트에서 타입 캐스팅은 인스턴스의 타입을 확인하는 용도로 사용됩니다.
또는 클래스의 인스턴스를 부모 또는 자식 클래스의 타입으로 사용할 수 있는지
확인하는 용도로 사용됩니다.
키워드는 is, as 를 사용합니다.
예제 클래스들 )
class Animal {
var name : String = ""
func crySound() {
print("동물은 각각의 독특한 울음소리를 가지고 있습니다")
}
}
class Dog : Animal {
var type : String = ""
func bark() {
print("강아지는 왈왈 짖습니다")
}
}
class Pet : Dog {
var clothes : String =""
func dressed() {
print("애완동물은 옷을 입을 수 있습니다")
}
}
var al : Animal = Animal()
var tong : Dog = Dog()
var mon : Pet = Pet()
//is 키워드를 통해 타입을 확인합니다.
var result : Bool
result = al is Animal // true
result = al is Dog // false , 동물이 꼭 개는 아닙니다.
result = al is Pet // false , 마찬가지로 동물이 꼭 애완동물은 아닙니다.
result = tong is Animal // true , 개는 동물이죠?
result = tong is Dog // true , 당연하죠?
result = tong is Pet // false, 개라고 꼭 애완동물은 아니죠.
result = mon is Animal // true, 애완동물도 동물이죠.
result = mon is Dog // true, mon 의 클래스인 Pet은 Dog 클래스를 상속 받았죠?
result = mon is Pet// true, 당연하죠?
다음은 업 캐스팅입니다. 다운 캐스팅은 많이 사용하지는 않는다고 합니다.
: as 키워드를 사용해서 부모 클래스의 인스턴스를 사용할 수 있도록,
컴파일러에게 타입 정보를 전환해 줍니다.
Any 타입이나 AnyObject 타입으로도 타입정보를 변환할 수 있습니다.
암시적으로 처리되므로 생략할 수도 있습니다.
예)
var a: Animal = Pet() as Animal
var b : Dog = Dog()
var c : any = Animal() as Any // as Any 생략 가능
마지막으로 다운 캐스팅입니다.
: as? 또는 as! 를 사용해서 자식 클래스의 인스턴스로 사용할 수 있도록
컴파일러에게 인스턴스 타입 정보를 전환해줍니다.
ex) 동물인데 강아지일 수 있느냐?
* 조건부 다운 캐스팅
var dog : Dog?
dog = a as? Pet() // 위에서 a는 실질적으로 Pet() 인스턴스를 할당했기 때문에
애완동물은 개가 될 수 있습니다.
dog = b as? Pet() // nil
dog = c as? Pet() // nil
하지만 b 나 c 는 개이거나 동물이기 때문에 애완동물로 다운 캐스팅을 할 수 없습니다.
* 강제 다운 캐스팅 // 강제로 역할을 주는 겁니다.
ex) 동물한테 넌 개를 해! ( 고양이에게 개를 하라고 한다면 오류가 발생한다)
var dog : Dog
dog = a as! Pet() // 위에서 a는 실질적으로 Pet() 인스턴스를 할당했기 때문에
애완동물은 개가 될 수 있습니다.
dog = b as! Pet() // 런타임 오류
dog = c as! Pet() // 런타임 오류
타입 캐스팅의 경우 swift에서 중요한 개념 중 하나이고, 딕셔너리같은 것들에서 많이 사용된다고 하니
잘 익혀두고 넘어가야겠습니다.
이상입니다~~
'Swift3(스위프트3)' 카테고리의 다른 글
swift3 스위프트3 protocol 프로토콜, 프로토콜 상속에 대해 (0) | 2017.07.12 |
---|---|
swift3 스위프트3 assert, guard (0) | 2017.07.11 |
swift3 스위프트3 옵셔널 체이닝 / nil 병합 연산자란? (0) | 2017.07.10 |
swift3 스위프트3 인스턴스의 생성, 인스턴스 소멸 (0) | 2017.07.07 |
swift3 스위프트3 상속 (0) | 2017.07.07 |