일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 함수
- RawValue
- 패스트캠퍼스
- userDefaults
- Realm
- cancelAsyncWrite
- 직장인자기계발
- 직장인인강
- 문자열 보간법
- swift
- 기본문법
- Threading
- 30개프로젝트로배우는iOS앱개발withSwift초격자패키지Online
- Background
- switch
- SeSAC
- ios
- 옵셔널 체이닝
- 패스트캠퍼스후기
- enum
- 인스펙터
- 열거형
- TableView
- 독학
- 프로퍼티 관찰자
- Optional Chaining
- 패캠챌린지
- Git
- beginAsyncWrite
- xcode
- Today
- Total
아삭아삭 iOS 개발
[Swift 독학] 패스트캠퍼스 챌린지 27일차_타입캐스팅 본문
■ 타입 캐스팅(type casting)
- 인스턴스의 타입을 확인하는 가능
→ 어떠한 클래스의 인스턴스를 (자체 클래스 계층 구조의) 다른 곳에서 부모 클래스 or 자식 클래스의 타입으로 사용 가능여부 확인 - 클래스와 딕셔너리에서 많이 사용
- 클래스와 하위 클래스의 계층도와 함께 타입 캐스팅을 사용하여
→ 특정 클래스 인스턴스의 타입 확인 가능
→ 같은 계층도 내에서 다른 클래스로 인스턴스를 캐스트 가능
→ (클래스의 계층도에 해당하는)클래스의 인스턴스를 포함하는 배열 정의 가능 - 타입 캐스팅을 사용해도 기본 인스턴스는 동일하게 유지됨
→ 즉, 캐스팅은 실제로 인스턴스를 수정하거나 값변경을 수행하지는 않음 - 타입 캐스팅을 사용하여 타입이 프로토콜을 준수하는지 확인 가능
요즘 베이징 올림픽하니까 오늘의 예시는 겨울 스포츠로 돌려보았다.
// 기본 클래스 WinterSprots 정의
class WinterSprots {
var athletename: String
init(athletename: String) {
self.athletename = athletename
}
}
// 하위클래스 FigureSkating, ShortTrack 2개 정의
class FigureSkating: WinterSprots {
var jump: String
init(athletename: String, jump: String) {
self.jump = jump
super.init(athletename: athletename)
}
}
class ShortTrack: WinterSprots {
var speed: Double
init(athletename: String, speed: Double) {
self.speed = speed
super.init(athletename: athletename)
}
}
// 3개의 FigureSkating인스턴스와 2개의 ShortTrack인스턴스를 포함하는 record라는 배열 상수를 생성
// FigureSkating와 ShortTrack이 WinterSprots의 상위 클래스를 공통으로 갖고 있으므로 record배열에 대해 [WinterSprots]에 타입으로 유추 가능
let record = [
FigureSkating(athletename: "김연아", jump: "트리플 러츠"),
ShortTrack(athletename: "곽윤기", speed: 40.239),
FigureSkating(athletename: "김연아", jump: "트리플 플립"),
FigureSkating(athletename: "김연아", jump: "트리플 토루프"),
ShortTrack(athletename: "곽윤기", speed: 83.007)
]
■ 타입캐스팅 구현 연산자
- is, as
: 값의 타입을 확인하거나 값을 다른 타입으로 변환하는데 사용
1) is 를 사용한 타입 검사
- 타입 검사 연산자(type check operator)인 is를 활용하여 인스턴스가 특정 하위 클래스 타입인지 확인
→ 인스턴스가 하위 클래스 타입이면 true, 아닐 경우 false 반환
var figureskatingCount = 0
var shorttrackCount = 0
for item in record {
if item is FigureSkating {
figureskatingCount += 1
} else if item is ShortTrack {
shorttrackCount += 1
}
}
print("WinterSprots library contains \(figureskatingCount) figureskatings and \(shorttrackCount) shorttracks")
// 프린트 결과 : WinterSprots library contains 3 figureskatings and 2 shorttracks
2) as를 사용한 다운 캐스팅
- 타입 캐스트 연산자(type check operator)인 as? 또는 as!를 활용하여 특정 클래스 타입의 상수 or 변수를 ‘다운캐스팅’하여 하위 클래스의 인스턴스를 참조할 수 있음
→ 즉, 자식클래스의 인스턴스를 사용하기 위해 컴파일러에게 인스턴스의 타입정보를 전환 가능
- 다운캐스팅은 실패할 수 있기 때문에 2가지 형태의 타입캐스트 연산자 제공 : as?, as!
2.1) as?
- 조건부 형식
- 다운 캐스팅시 (다운 캐스팅 하려는)타입의 옵셔널 값으로 반환
- 다운 캐스트 성공여부 확신이 없을 때 사용
→ 항상 옵셔널 값을 반환하며, 다운캐스트가 불가능할 경우 nil 반환
(= 다운 캐스트 성공여부 확인용으로 사용 가능)
// 각 항목에서 사용할 실제 클래스를 사전에 알 수 없으므로 루프를 통해 매번 다운 캐스트 확인을 위해 as? 사용
// FigureSkating 으로 현재 item을 다운 캐스트하는 것으로 시작
// item이 세 개의 클래스 중 어떤 것일지 모르니까 as? 사용
// as?은 하위 클래스 타입으로 다운캐스트 시도시 옵셔널 값으로 반환하므로, item as? FigureSkating 의 결과는 FigureSkating? 타입 혹은 "옵셔널 FigureSkating"임
// 라이브러리 배열에 ShortTrack 인스턴스로 적용시 FigureSkating로 다운 캐스팅에는 실패하며, 이를 대응하기 위해 옵셔널 바인딩 사용
// -> 즉, FigureSkating로 item은 접근하려고 하는데, 성공하면 반환된 옵셔널 FigureSkating을 figureskating라는 새로운 임시 상수로 설정해라~
for item in record {
if let figureskating = item as? FigureSkating {
print("FigureSkating: \(figureskating.athletename), skill \(figureskating.jump)")
} else if let shorttrack = item as? ShortTrack {
print("ShortTrack: \(shorttrack.athletename), personal record \(shorttrack.speed)")
}
}
// FigureSkating: 김연아, skill 트리플 러츠
// ShortTrack: 곽윤기, personal record 40.239
// FigureSkating: 김연아, skill 트리플 플립
// FigureSkating: 김연아, skill 트리플 토루프
// ShortTrack: 곽윤기, personal record 83.007
2.2) as!
- 강제 형식
- 다운 캐스팅을 시도하며 강제 언랩핑하여 값을 반환
- 다운 캐스트 성공여부 확신이 있을 때 사용
※ 만약 잘못된 클래스 타입으로 다운캐스팅할 경우, 런타임에러가 발생하여 프로그램이 강제종료됨
3) as를 사용한 업 캐스팅
- as 사용하여 부모클래스의 인스턴스를 사용할 수 있도록, 컴파일러에게 타입정보를 전환해줌
- 많이 사용하지는 않음
본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.
■ fast campus강의 외 참조자료
[1] https://blog.yagom.net/560/
[2] https://bbiguduk.gitbook.io/swift/language-guide-1/type-casting
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[Swift 독학] 패스트캠퍼스 챌린지 29일차_프로토콜 (0) | 2022.02.21 |
---|---|
[Swift 독학] 패스트캠퍼스 챌린지 28일차_assert와 precondition과 guard (0) | 2022.02.20 |
[Swift 독학] 패스트캠퍼스 챌린지 26일차_오버라이딩 (0) | 2022.02.18 |
[Swift 독학] 패스트캠퍼스 챌린지 25일차_상속 (0) | 2022.02.17 |
[Swift 독학] 패스트캠퍼스 챌린지 24일차_프로퍼티 래퍼 (0) | 2022.02.16 |