티스토리 뷰
타입캐스팅
인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스터스인 것처럼 사용할 수 있는 방법
is 와 as를 연산자로 사용.
캐스팅은 실제로 인스턴스를 수정하거나 값을 변경하는게 아님.
-> 어떤 타입으로 접근할 지 힌트를 주는 것 뿐, 인스턴스는 메모리에 똑같이 남아있음.
아래와 같이 세 가지 클래스를 선언해주었음.
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
상속 관계를 보면 MediaItem의 특성들을 Movie와 Song이 포함하고 있음.
-> Movie와 Song은 MediaItem인 척 할 수 있다는 얘기
데이터 타입 확인
아래의 결과에서 확인할 수 있듯이, is로 타입을 확인할 수 있음.
-> 해당 클래스의 인스턴스라면 true를, 아니라면 false를 반환.
다운캐스팅
자식클래스보다 상위에 있는 부모클래스의 타입을 자식 클래스의 타입으로 캐스팅하는 것.
as?와 as!를 이용해 다운캐스팅함.
as!는 다운캐스팅이 실패했을 경우 nil을 반환하기때문에 런타임 에러가 날 가능성이 큼.
하지만 as? 는 반환타입이 옵셔널이기때문에 nil을 반환.
타입이 Movie인 경우에 프린트 구문이 출력됨.
만약 컴파일러가 다운캐스팅을 확실할 수 있는 경우엔 !나 ?없이 as를 사용할 수 있음.
Any, AnyObject
Any와 AnyObject는 타입을 특정하지 않고 여러 타입의 값을 할당할 수 있음.
Any는 함수 타입을 포함한 모든 타입이 가능하고, AnyObject는 클래스 타입만 가능함.
컴파일 시점에는 어떤 타입으로 된 멤버를 가지고 있는지 알 수 없음.
-> 그래서 타입캐스팅을 하지 않으면 접근 불가.
Generic
타입에 유연하게 대응하기 위한 요소.
아래처럼 작성.
왼쪽처럼 매번 반복해서 작성하던 것을 오른쪽처럼 한 번에 작성 가능.
T를 Type Parameter라고 함.
T에 들어가는 타입은 전부 같아야함.
그래서 아래처럼 타입에 대한 제약을 줄 수도 있음.
만약 다른 타입을 주고 싶다면, T뿐만 아니라 T U K...를 이용해 아래처럼 선언.
화면 전환 값 전달 - Closure이용
값을 전달할 뷰컨트롤러에서 프로퍼티로 클로저를 만들어준 뒤, 액션을 통해 해당 클로저가 실행될 수 있게 해줌.
데이터를 전달 받을 뷰컨트롤러에서 위에 작성해주었던 클로저 내의 코드를 작성해줌.
위의 값 전달을 풀어서 순서대로 설명하면 아래와 같음.
1. 데이터를 전달받을 뷰컨트롤러에서 버튼을 이용해 ProfileViewController를 띄움.
-> 띄우는 동시에, ProfileViewController의 saveButtonActionHandler의 코드를 작성해줌.
2. ProfileViewController에서 값을 작성하고 저장 버튼을 누르면, 호출 연산자를 이용하여 클로저를 실행함.
-> 이때 transitionButton의 title이 ProfileViewController에서 작성되어있던 값으로 바뀜.
3. 화면 Dismiss
'TIL' 카테고리의 다른 글
[TIL] 2022 / 08 / 20 (0) | 2022.08.21 |
---|---|
[TIL] 2022 / 08 / 19 (0) | 2022.08.20 |
[TIL] 2022 / 08 / 17 (0) | 2022.08.17 |
[TIL] 2022 / 08 / 15(frame과 bounds) (0) | 2022.08.16 |
[TIL] 2022 / 08 / 12 (0) | 2022.08.12 |
- Total
- Today
- Yesterday