'required' initializer 'init(coder:)'

JJUDEV·2023년 5월 24일
1

Swift

목록 보기
4/14

UIViewController를 상속받아 이니셜라이저를 작성하려고 하면, 아래와 같은 에러가 나옵니다.

이니셜라이저인 init(coder:)를 작성해야한다는 것인데, 왜 이 requred init을 작성해야 하는 것일까?
궁금해서 찾아보다가 알게 된 결과를 공유합니다.

  • required init(coder:) 작성해야 하는 이유

UIViewController가 정의된 곳으로 타고 가보면 'NSCoding' 프로토콜을 채택하고 있습니다. NSCoding의 설명을 살펴봅시다. (이하 구글 트렌슬레이터)

NSCoding 프로토콜은 해당 클래스의 인스턴스가 인코딩 및 디코딩될 수 있도록 클래스가 구현해야 하는 두 가지 메서드를 선언합니다. 이 기능은 보관(객체 및 기타 구조가 디스크에 저장되는 경우) 및 배포(객체가 다른 주소 공간에 복사되는 경우)의 기반을 제공합니다.
개체 지향 설계 원칙에 따라 인코딩 또는 디코딩되는 개체는 해당 인스턴스 변수를 인코딩 및 디코딩할 책임이 있습니다. 코더는 객체에 encode(with:) 또는 init(coder:)를 호출하여 그렇게 하도록 지시합니다. encode(with:)는 인스턴스 변수를 제공된 코더로 인코딩하도록 개체에 지시합니다. 개체는 이 메서드를 여러 번 받을 수 있습니다. init(coder:)는 객체가 제공된 코더의 데이터에서 자체적으로 초기화하도록 지시합니다. 따라서 다른 초기화 방법을 대체하고 개체당 한 번만 전송됩니다. 코딩할 수 있어야 하는 모든 객체 클래스는 NSCoding 프로토콜을 채택하고 해당 메서드를 구현해야 합니다.
코더가 지원하는 가능한 아카이빙 유형을 고려하는 것이 중요합니다. macOS 10.2 이상에서는 키 보관이 선호됩니다. 그러나 클래식 아카이빙을 지원해야 할 수도 있습니다. 자세한 내용은 Archives and Serializations Programming Guide를 참조하십시오.

위 설명을 요약하자면,
NSCoding은 클래스가 encoding, decoding 가능하게 해주는 프로토콜인데 이 프로토콜을 채택한 클래스는 encode(with:)와 init(coder:) 두가지 멤버를 구현해야 한다는 것입니다. (프로토콜은 요구사항이므로)

그런데, 이니셜라이저를 오버라이드하지 않았을 때는 위와 같이 init(coder: NSCoder)를 구현하라고 에러가 나지 않습니다. 이는 부모의 이니셜라이저를 자식 클래스에서 자동으로 상속받기 때문입니다.

따라서! init을 오버라이드해주었을 땐 NSCoding 프로토콜의 요구사항인 init(coder:)를 구현해주어야 한다!

이상 마칩니다 :)

참고자료

profile
4년차 앱개발자입니다.

0개의 댓글