반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- UIButton
- viewcontroller
- Understanding Swift Performance
- TableView
- entrypoint
- DispatchQueue
- weak
- uikit
- 연산 프로퍼티
- SWiFT
- property wrapper
- OperationQueue
- userdefaults
- AppTransportSecurity
- Remot Push
- ios
- 트레일링 클로저
- firebase
- tableViewCell
- RunLoop
- Choosing Between Structures and Classes
- 진입점
- 원격 푸시
- IBOutlet
- 동시성프로그래밍
- IBOutletCollection
- for-in
- CoreLocation
- 후행 클로저
- WWDC16
Archives
- Today
- Total
iOS 공부하는 감자
Day13) 타입캐스팅 본문
반응형
타입캐스팅
- 인스턴스의 타입을 확인하거나, 해당 인스턴스의 타입을 부모 클래스나 자식 클래스로 취급하는 방법이다.
- 타입캐스팅을 사용하여 인스턴스의 타입이 프로토콜에 적합한지 여부도 확인 가능하다.
- is, as 키워드를 사용한다.
- 클래스의 인스턴스에서 자주 사용한다.
- 딕셔너리나 Any, AnyObject같은 타입을 많이 사용하면 유용하다.
is
-
인스턴스 is 타입이름 // -> bool
- 인스턴스의 타입을 확인하는 연산자로, 런타임 시점에 체크가 이루어진다.
- 확인할 인스턴스가 타입의 서브 클래스(자식 클래스)를 사용한 인스턴스여도 true를 반환한다.
-
class Person { let name: String = "" } class Student: Person { var age: Int = 25 } let dong: Student = Student() dong is Student // true // 비교할 인스턴스의 부모 클래스로 is 연산을 수행해도 true 반환 dong is Person // true
as : 타입캐스팅
인스턴스 as 변환할 타입 // 업 캐스팅
인스턴스 as? 변환할 타입 // 다운 캐스팅
인스턴스 as! 변환할 타입 // 다운 캐스팅
- 인스턴스가 변환할 타입과 호환 가능하면, 해당 타입으로 변환된 인스턴스를 반환
- as: 업 캐스팅
- 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보 전환
- Any, AnyObject로 변환도 가능 (상속 관계로 이루어지지 않았어도 가능)
- 암시적으로 처리되므로 ( as 변환할 타입 ) 생략이 가능하다. (업 캐스팅은 항상 성공하기 때문)
-
let dong: Student = Student() let upCasting: Any = dong as Any let upCasting: Any = dong
- as?, as! : 다운 캐스팅
- 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보 전환
- 다운 캐스팅은 실패할 수 있기 때문에 ?, ! 를 추가로 붙여서 사용
-
let dong: Person = Person() // let downCasting: Student = dong 당연히 암시적 처리로 코드 생략 불가능 let downCasting: Student = dong as! Student
- 만약 자식 클래스가 아닌 다른 클래스로 다운 캐스팅을 시도하면 에러남 -> 이를 방지하기 위해 옵셔널(?, !)이 붙은 것
- as? : 런타임 시점에 다운 캐스팅을 시도하고, 실패할 경우 nil 반환
-
let dong: Person = Person() // nil을 리턴할 가능성이 있기 때문에 Optional로 선언해야됨 let downCasting: Student? = dong as? Student // nil
- as! : 런타임 시점에 타입 캐스팅을 시도하고, 실패할 경우 에러 발생
-
let dong: Person = Person() let downCasting: Student = dong as! Student // error: Execution was interrupted,,,
- 옵셔널 강제 추출을 비추하는 것처럼 as! 보단 as? 사용을 권장함!
-
// if-let을 통해 옵셔널을 추출해서 사용 예시 let dong: Person = Student() as Person // Student로 생성하고, Person으로 업 캐스팅 if let student = dong as? Student { print(student.studentNumber) // 1234 }
-
// 활용 예시2 let dong: Person = Student() as Person // Student로 생성하고, Person으로 업 캐스팅 let jun: Person = Person() func doSomething(someone: Any) { if let student = someone as? Student { print(student.studentNumber) }else if let person = someone as? Person { print(person.name) } } doSomething(someone: dong) // 1234 doSomething(someone: jun) // jun
알고리즘
https://co-dong.tistory.com/23
반응형
'22 베이직 챌린지' 카테고리의 다른 글
Day15) Xcode 디버깅 (0) | 2022.01.17 |
---|---|
Day14) 객체지향 프로그래밍 (0) | 2022.01.16 |
Day12) 옵셔널 (0) | 2022.01.14 |
Day11) 프로토콜, 익스텐션 (0) | 2022.01.13 |
Day10) 클래스와 상속 (0) | 2022.01.12 |