iOS 개발일지
Required Initializer / init(frame: )와 init(coder: )는 뭐가 다를까? 본문
Required Initializer라는 이름에서 알 수 있듯이, 반드시 구현해야하는 이니셜라이저를 뜻한다.
만약 클래스에 required init이 있다면, 해당 클래스를 상속받는 자식 클래스는 required init을 반드시 구현해야 한다.
코드로 UI를 구현하기 위해 init(frame: )을 호출하면 오류가 발생한다.
모든 View는 NSCoding 프로토콜을 채택하고 있기 때문에, 위와 같은 오류가 발생하는 것이다.
부모 클래스에서 프토토콜을 채택하고 있고, 해당 프로토콜에 init이 있을 경우에도 required init를 구현해야 한다.
덧붙여서 Swift에서는 특정 조건을 만족하면 부모의 이니셜라이저를 자동 상속받을 수 있다.
1. 만약 자식 클래스에서 추가된 저장 프로퍼티가 모두 기본값을 가지고 있고, 추가적인 지정 이니셜라이저를 작성하지 않았다면 (지정이니셜라이저의 오버라이드 포함) 부모 클래스의 모든 지정 이니셜라이저를 자동으로 상속받는다.
2. 부모의 이니셜라이저를 상속받았거나, 혹은 부모의 모든 지정 이니셜라이저를 오버라이드했다면 부모의 편의 이니셜라이저를 자동으로 상속받는다.
이 조건을 만족시키지 않고, init(frame: ) 을 오버라이드 했기 때문에 이니셜라이저 상속을 포기한 것이 된다.
따라서 init(coder: ) 는 자동으로 상속되지 않기 때문에 수동으로 직접 작성해야 한다.
이 때는 특별하게 구현할 것이 없기 때문에, 그냥 에러 메세지를 눌러 fix 하면 알아서 required init를 호출해준다.
- init(frame: )
코드로 UIView Class의 View 인스턴스를 만들기 위해 지정된 이니셜라이저
해당 이니셜라이저를 통해 구현하고자 하는 뷰의 중심 (cneter) 과 경계선 (bounds) 을 지정한다.
코드로 작성하려는 UILabel, UIButton, UIView 등등 frame을 가진 모든 뷰객체는 해당 이니셜라이저 안에서 초기화되어야 한다.
- init(coder: )
xib나 storyboard를 사용해서 UI를 구성할 경우, Interface builder는 코드가 아니기 때문에 이를 코드로 변환해야 한다.
이 과정을 unarchiving 라고 하며, 여기서 init?(coder: ) 를 사용하게 된다.
코드로 UI를 구성했을 경우 구현할 필요가 없는 코드지만, 프로토콜이기 때문에 강제로 호출하게 된다.
에러 메세지의 fix 버튼을 통해 required init를 자동완성하면, 위와 같이 fatalError도 자동완성된다.
만약 해당 이니셜라이저에 오류가 발생할 경우 fatalError의 로그를 통해 문제가 어디에서 일어났는지 유추할 수 있게 해준다.
반대로 말하면, 해당 문제로 런타임 에러가 발생하지 않는 이상 저 구문은 실행되지 않는다.
'iOS' 카테고리의 다른 글
(비공개) (0) | 2023.06.15 |
---|---|
Objective-C에 대해 아주아주 간단히 알아보자 (0) | 2023.03.08 |
iOS 비동기/동시성 프로그래밍에 대해 알아보자! (1) | 2023.02.03 |
SDK, Framework, Library, API 용어 정리 (0) | 2023.01.30 |
iOS 14 이상 버전에서 IDFA 권한 요청하기 (1) | 2023.01.29 |