티스토리 뷰
인용출처: https://soooprmx.com/archives/7230
이 init(coder:)는 NSCoding이라는 프로토콜에 정의되어 있다. 이 프로토콜은 표준 키 기반 아카이브를 통해서 직렬화가능한 클래스에 적용되는데, UI를 구성할 수 있는, 그러니까 nib 파일에 들어갈 수 있는 모든 클래스는 이 프로토콜을 따르고 있다. 그런데 이때 요 이니셜라이저는 convenience가 붙지 않은, 지정 이니셜라이저이다.
그리고 또 한가지, Swift는 기본적으로 서브클래스가 수퍼클래스의 이니셜라이저들을 상속받지 않은 것을 원칙으로 하고 특별한 경우에 자동 상속을 허용한다. 이니셜라이저의 자동상속은 다음의 조건을 만족해야 한다.
1. 만약 자식 클래스에서 추가된 저장 프로퍼티가 모두 디폴트 값을 가지고 있고, 추가적인 지정 이니셜라이저를 작성하지 않았다면(여기서는 추가되는 지정이니셜라저 혹은 지정이니셜라이저의 오버라이드가 모두 포함된다.) 부모 클래스의 모든 지정 이니셜라이저를 상속받는다.
2.부모의 이니셜라이저를 상속받았거나, 아니면 부모의 모든 지정 이니셜라이저를 오버라이드했다면 부모의 편의 이니셜라이저를 자동으로 상속받는다.
여기서 문제 상황은 2번이다. init(frame:)을 오버라이드했다는 것은 부모의 일부 지정 이니셜라이저를 오버라이드했다는 것이다. 이 경우에는 이니셜라이저 상속을 포기한 것이 되고, init(coder:) 는 자동으로 상속되지 않기 때문에 수동으로 직접 작성해야 한다."
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
이 코드를 xib에서 쓰려면 둘 다 써줘야 하는 이유를 이제 알았다! 일부 이니셜라이저만 override 하면 안되기 떄문이구나,.,,
'macOS, iOS' 카테고리의 다른 글
xib로 만든 파일을, 다른 스토리보드에서도 렌더링해서 보고 싶다면? (0) | 2019.11.15 |
---|---|
[Swift] typealias (0) | 2019.11.13 |
[iOS] view outlet was not set 에러 고치기 (xib) (0) | 2019.11.11 |
[iOS] image Literal, 아이콘으로 xcode에서 사진이나 색깔 넣기 (0) | 2019.11.11 |
[iOS] terminal에서 'Xcode is not installed' 에러 뜰 때 (0) | 2019.11.09 |