매번 UIView를 상속해서 커스텀 뷰를 만들면 해당 에러코드가 떴던 기억이 있을 것이다.
난 저 초기화 구문을 사용하지 않는 것인데도, 매번 떠서 빡친 기억...
잇을 것임. 분명...
이것이 왜 떳는지! 코드를 통해서 알아보자면,
example이라는 프로토콜 내에 초기화구문이 있고, Mobile 클래스가 해당 프로토콜을 채택하고 있다.
그 경우에 에러 메시지가 말하길! required를 작성해주라고 말하고 있다.
즉,
required라는 키워드는 프로토콜에 있는 초기화 구문이기 때문에 붙는 것이다.
그래서 아까 그 매번 뜨던 에러메시지는.... 프로토콜 초기화 구문이기에 호출되는 것이다.
왜냐하면 프로토콜 내 프로퍼티나 메소드는 optional이 아니면 항상 불리기 때문이다.
아 ~ 초기화 구문이 프로토콜에 있어서 required를 붙여줘야 하는구나!
여하튼,,, 근데 안쓰는 저 아이는 언제 쓰이는 초기화구문인가?!
UIView에는 초기화 구문이 2개 있다.
NSCoder라는 프로토콜을 채택함으로써 생긴 초기화구문과 UIView 자체의 초기화구문 2개가 있는 것을 확인할 수 있다.
- init(frame) -> code로 작업할 때 호출이 된다.
- required init(coder) -> 스토리보드로 만들 때 호출이 된다.
- Encoding 과정을 거칠 때, XIB는 스위프트가 아니기 때문에 애플이 이해할 수 있는 파일로 변경해서 빌드가 되는 것이다.
? 이 붙은 이유, 그러니까 옵셔널이 붙은 이유는
required init은 코드베이스일 때는 동작하지 않는다. 그렇기 때문에 nil을 받아서 동작이 안될 가능성을 열어둬야 하기 때문이다.
또한,
required 구문이 성공할 경우에 fatalError가 발생해서 앱이 동작을 멈추는데, 이유는 반환값이 Never이기 때문이다.
그렇기 때문에 xib로 작업 시에는 required init이 무조건 실행되기 때문에 내부에 fatal Error를 작성하면 안된다.
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] loadView() (0) | 2022.08.21 |
---|---|
[Swift] Generic (0) | 2022.08.21 |
[iOS] CodeBase로 가보자고 (0) | 2022.08.17 |
[iOS/Swift] Custom Framework를 만들면서 배우는 접근제한자 (0) | 2022.08.16 |
[iOS] UIPageViewController (0) | 2022.08.16 |