Connect 개발 회고 Init 메소드(4)

이건준·2022년 8월 25일
0

1. 문제제기

  • Connect 앱에서 FloatingPanel을 보여주는 부분을 서로 다른 floatingType을 Init의 인자로 받아 각각에 따라 맞는 화면을 띄어주는 것으로 코드를 하였다

  • 그러다가 검색바를 이용해 지역을 검색하는 .searchResult 타입인 경우에만 따로 KakaoAPI를 통해 받아온 결과값을 인자로 넘겨줘야하는 상황이다

  • .who, .study, .searchResult 3개의 타입 모두 floatingType을 동일하게 받지만 .searchResult만 다른 하나의 인자를 더 받는 것이다

2. Init

  • init 메소드에는 총 2가지의 종류가 존재한다

Designated Init

  • Designated Init은 우리가 평소에 사용해왔던 Init메소드를 일컫는다

  • 굳이 Designated를 붙일 필요없이 평소처럼 사용해줄 수 있다

  • Designated Init의 특징은 상속받고 있는 클래스를 반드시 super.init을 통해 초기화시켜줘야하는 특징이 존재한다

init(floatingType: FloatingType) {
        self.floatingType = floatingType
        super.init(nibName: nil, bundle: nil)
    }
  • 위 코드처럼 Designated Init은 우리가 평소에 알았던 부분처럼 모든 프로퍼티들을 초기화시켜주기위한 역할을 가진다

Convenience Init

  • Convenience Init은 반드시 init앞에 convenience라는 키워드를 붙여주어야한다

  • 이 Init메소드는 Designated Init과 다르게 상속하는 부모클래스의 init을 호출할 필요없이 해당 클래스의 Designated Init을 이용하여 일부 초기화시켜주어야한다

convenience init(kakaoAddressResults: [KakaoMapAddress]) {
        self.init(floatingType: .searchResult)
        self.kakaoAddressResults = kakaoAddressResults
    }
  • 즉 앞서 선언한 Designated Init을 Convenience Init안에서 한번 호출해줌으로써 상속클래스의 프로퍼티들을 초기화시켜주기에 굳이 super.init을 코드해줄 필요없는것이다

Q. 그렇다면 Convenience Init은 언제 사용하는 것일까 ??

  • convenience init의 사용때를 위 코드를 예시로 설명을 하자면 굳이 init의 인자로 넘길 필요없이 동일한 인자를 넘겨야할 경우 사용된다

  • 위에서 설명했던 것처럼 .searchResult인 경우에만 [KakaoMapAddress]를 넘겨주기때문에 [KakaoMapAddress]를 넘기는 경우는 반드시 floatingType이 .searchResult여야만 한다

0개의 댓글