UIView를 상속했을 때 나타나는 required init(coder: NSCoder)는 무엇일까

raindrop·2023년 4월 10일
1
post-custom-banner

UIView를 상속해서 클래스를 선언하면 required initializer를 추가해야한다는 에러가 나타난다.

required initializers
required 키워드를 사용한 initializers는 subclass에서 모두 구현해야 한다. required 키워드를 재사용하여 다음 subclass에서도 구현해야 함을 표현한다. override 키워드는 함께 사용하지 않는다.

이 init(coder:)는 무엇일까?
init(frame: CGRect)의 경우, 코드에서 뷰를 생성할 때 사용한다. init(coder:)는 IB에서 뷰를 만들 때 호출되는 함수이다. 파라미터 coder의 타입은 NSCoder인데, 객체와 데이터를 전달하는 기능을 선언하는 인터페이스이다. 그리고 이 인터페이스를 따르는 객체를 coder라고 부른다. 스토리보드나 xib에서 작성된 뷰는 xml형태로 저장된다. xml 형태를 전달, 연결하는 매개체가 coder이며, decoding, encoding을 수행한다.

  • NSCoder : 객체, 데이터를 전달하는 기능을 선언하는 인터페이스
  • coders : NSCoder를 따르는 객체들, decoding, encoding 수행
  • init(frame: CGRect) : 코드에서 뷰를 초기화할 때 사용
  • init(coder: NSCoder) : 인터페이스 빌더에서 뷰를 초기화할 때 사용

init(coder: NSCoder) 사용해보기

현재 RectangleView라는 이름을 가진 Custom UIView는 UIView를 상속하고 있다. Cmd + Shift + L을 눌러 UIView를 추가한다.

그리고 Custom Class로 지정해준다.

ctrl + drag로 연결해주면 @IBOutlet으로 연결해줄 수 있다.

디버거에서 출력해보면 init(coder: NSCoder)로 생성된 인스턴스임을 확인할 수 있다.

여러 레퍼런스에 따르면 위와 같이 어느 쪽에서 생성하더라도 예측할 수 있게 두 init의 동작을 일치시키는 것이 일반적인 것으로 보인다.

레퍼런스 및 찾아본 자료

https://medium.com/@b9d9/required-init-coder-nscoder-에-대해서-b67ddfc628
https://h4njun.tistory.com/entry/NSCoder
https://velog.io/@inwoodev/iOS-initframe-initcoder
https://ios-development.tistory.com/222
https://leeari95.tistory.com/63
https://minryul.tistory.com/13?category=1256446
https://alexpaul.dev/2019/01/26/why-is-it-best-practice-to-implement-initcoder-when-subclassing-uiview/
https://itecnote.com/tecnote/ios-when-is-required-initcoder-adecoder-nscoder-called-on-a-uiview-or-uiviewcontroller/
https://stackoverflow.com/questions/46926831/difference-between-override-init-and-required-init-swift
https://jinios.github.io/ios/2018/04/15/customView_init/

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 4월 12일

오 넘어갔던 내용인데 알고 나니까 되게 유익하네요 ! 참고 자료들도 내용이 좋아서 새로운 개념들도 많이 알아갑니다

답글 달기