티스토리 뷰
728x90
반응형
다운캐스팅(downcasting) = 부모클래스의 타입을 자식클래스의 타입으로 다운하여 캐스팅한다
다운캐스팅이 쓰이는 경우 2가지 예제를 정리하려고 한다. 하나는 기본 swift 예제 , 하나는 지금 앱개발하면서 커스텀 뷰안에서 쓰고 있는 예제
ex -1 )
다음과 같은 클래스가 있다고 하자
부모클래스인 디저트클래스와 이를 상속받은 자식클래스 두개 아이스크림클래스와 초콜릿클래스!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | class Dessert{ let name:String let cal:Int var description:String{ return "\(name)은 \(cal)칼로리..하지만 맛있게 먹으면 0칼로리" } init(name:String,cal:Int) { self.name = name self.cal = cal } } class Icecream:Dessert{ let flavor:String override var description:String{ return "\(flavor)맛 \(name)은 \(cal)칼로리..하지만 맛있게 먹으면 0칼로리" } init(name: String, cal: Int, flavor:String) { self.flavor = flavor super.init(name: name, cal: cal) } } class Chocolate:Dessert{ let cacaoPercent:Int //카카오함유량 override var description:String{ return "카카오함유량\(cacaoPercent)% \(name)은 \(cal)칼로리..하지만 맛있게 먹으면 0칼로리" } init(name: String, cal: Int, cacaoPercent:Int) { self.cacaoPercent = cacaoPercent super.init(name: name, cal: cal) } } | cs |
타입캐스팅의 3가지 방법
1) as! = 강제 타입 변환 -> 안쓰는 게 좋다
2) as? = 옵셔널 타입 변환
3) as = 넘나 당연한 타입변환 ex) 디저트클래스타입을 디저트클래스타입으로 형변환
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | //보통 이런식으로 쓰이지만 let dessert = Dessert(name: "달달구리디저트", cal: 1000) let icecream = Icecream(name: "바세츠아이스크림", cal: 500, flavor: "체리치즈") let chocolate = Chocolate(name: "이마트다크초콜릿", cal: 480, cacaoPercent: 58) //아이스크림 인스턴스를 참조하고 있지만 디저트 타입 인척하는 참조변수도 있다 let icecream2:Dessert = Icecream(name: "바세츠아이스크림", cal: 500, flavor: "딸기치즈") type(of: icecream2) //output = 디저트 // 왜때문에? 편의를 위해 이런식의 배열로 묶여서 자주 쓰이기 때문이다 // 다형성(=dynamic binding) : 하나의 객체를 형태 또는 타입를 바꿔서 사용할 수 있다 이라고 표현한다 var dessertList:[Dessert] = [] dessertList.append(icecream) dessertList.append(icecream2) dessertList.append(dessert) dessertList.append(chocolate) if let icecream = dessertList.first as? Icecream{ print(icecream.description) } else{ print("다운캐스팅 실패") } //output = 체리치즈맛~ if let chocolate = dessertList.last as? Chocolate{ print(chocolate.description) } else{ print("다운캐스팅 실패") } //output = 카카오함유랑~ | cs |
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html
여기 예제 너무 좋다
반응형
'🍏 > Swift' 카테고리의 다른 글
[Swift] Swift에서 정규표현식(Regular Expression)을 이용하기 (1) | 2018.09.10 |
---|---|
[Swift] Static / Class / Final Class fuction & variable 차이 (0) | 2018.07.27 |
[Swift] ?? 연산자는 어떤 의미일까 (0) | 2018.07.24 |
[Swift] 데이터 타입 정리 (0) | 2017.06.10 |
[Swift] print와 dump (0) | 2017.06.10 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Django FCM
- flutter 앱 출시
- DRF APIException
- Flutter Spacer
- github actions
- drf custom error
- Python Type Hint
- 장고 URL querystring
- Flutter Text Gradient
- flutter dynamic link
- SerializerMethodField
- PencilKit
- 구글 Geocoding API
- ipad multitasking
- flutter build mode
- Dart Factory
- ribs
- 플러터 얼럿
- Watch App for iOS App vs Watch App
- flutter deep link
- 장고 Custom Management Command
- 플러터 싱글톤
- Flutter getter setter
- Flutter Clipboard
- Django Heroku Scheduler
- Flutter 로딩
- Sketch 누끼
- METAL
- Django Firebase Cloud Messaging
- cocoapod
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함