티스토리 뷰

TIL

[TIL] 2022 / 08 / 18

희철 2022. 8. 18. 21:33

타입캐스팅

 

 

인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스터스인 것처럼 사용할 수 있는 방법

 

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