required init?(coder: NSCoder)
xib에서는 xml 형태로 인터페이스 빌더 구성 정보를 가지고 있다.
Xcode의 인터페이스 빌더에서 구성한 값들은 모두 .xib 파일로 저장이 되는데 .xib는 컴파일러가 이해할 수 없기 때문에 스토리보드나 xib 파일을 읽기 위해서 컴파일 시에 이해할 수 있는 형식인 nib으로 변환이 되는 것이다.
(+ 그래서 UINib(nibName: "name", bundle: nil)을 통해 파일의 컨텐츠를 메모리에 캐시하고 있다가 초기화 시점에 Unarchiving을 하고 사용자의 씬에 보여주는 것이다.
여기서 Unarchiving은 xib 모델 객체를 저장하기 위해서, 객체의 프로퍼티를 기록하고 파일 시스템에 저장하는 작업을 archiving이라고 하는데 그 반대개념이다. xib 모델 객체를 파일 시스템에 저장했다면 그걸 통해서 객체를 생성하는 것이다.
NSCoder에 있는 decoder를 통해 데이터를 생성해내는 것이다. )
https://ios-development.tistory.com/472
(+ 또는 Bundle.main.loadNibNamed("name", owner: self, options: nil) 메소드를 통해 .nib 파일을 로드하고 사용자의 씬에 보여주는 것)
여하튼! nib 파일로 변환되기에 사용자의 씬에 출력하기 위해서는 init(coder: NSCoder)를 통해 객체를 생성해줘야 한다.
NSCoder의 decoder로 데이터를 생성하겠군...
required 라는 키워드는 무슨 뜻인가?
프로토콜 내에서 초기화 구문을 작성해둘 수 있다.
초기화 구문이 프로토콜로 명세되어 있음을 알려주는 것이다.
이 초기화 구문은 프로토콜에서 온 것이구나! 라고 알면 된다.
NSCoding 은 또 뭔가?
프로토콜인데, archiving 그리고 unarchiving 되기 위해 객체를 인코딩, 디코딩할 수 있게 하는 프로토콜이다.
이 부분에서 archiving과 serialization 이라는 개념이 나온다.
이전 수업 시간 설명에서도 들었듯이,
직렬화, Encoding, Serialization <-> 역직렬화, Decoding, Deserialization
클래스, 구조체, 배열 등의 데이터를 문자열로 변환하고 01010110으로 외부에 전송할 수 있게 변환하는 과정을 인코딩이라고 하고, (또는 직렬화) 반대로, 서버에서 문자열로 변환 후 우리가 쓸 수 있게 직렬화된 데이터를 다시 시스템이 사용할 수 있게 (iOS가 사용할 수 있게) 변환하는 과정을 디코딩이라고 한다. 같은 개념이겠지? 깊이 들어가니 댕 어렵군..
<간단요약>
- 직렬화 = 내가 구성한 뷰의 상태를 앱의 디스크에 저장하는 과정
- 역직렬화 = 디스크에 저장된 상태를 불러오는 과정
- NSCoding은 직렬화, 역직렬화를 해주는 프로토콜
기억할 것은 .xib 파일은 컴파일러가 알아 먹을 수 없는 파일이라 nib으로 변환되는 것이고, 그 과정에서 초기화 시점에 NSCoder 내의 Decoder가 데이터를 생성해내는 것이고 이걸 Unarchiving이라고 칭한다고 보면 된다.
그리고 이 초기화 구문에는 required 키워드가 프로토콜에서 명시해뒀기 때문에 들어간다고 보면 될 것 같다.
코드로 UI를 짤 경우, 동작하는 초기화 구문과 인터페이스 빌더 UI 초기화 구문은 다르다.
override init -> 코드 베이스 UI
required init -> 인터페이스 빌더 UI
override init(frame: CGRect)
인터페이스 빌더에서 사용되지 않고, Custom class를 코드로 구성 시에 사용하는 생성자이다.
단, 코드로 구성 시에 required init?(coder: NSCoder)를 함께 호출해야 한다.
그동안 매번 커스텀 클래스로 UIView를 생성 시에 오류 메시지로 required init 초기화 구문을 fix 버튼을 눌러서 생성해줬었다. 이유도 모르고 작성한 코드 구문을 이번에 알게 되어서 속이 시원하다. 한편으로는 찾아보려고 노력도 안한 내 자신이 놀라울 따름...
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] 간만에 코드 자랑하기 (0) | 2022.08.10 |
---|---|
[iOS] xib 사용해서 재사용 가능한 Custom View 만들기 (0) | 2022.08.10 |
[iOS] Swift Attribute 중 @IBInspectable과 @IBDesignable (0) | 2022.08.09 |
[iOS] 동기, 비동기 시작하기 앞서 그냥 오늘 배운 거... (0) | 2022.08.05 |
[Swift] 강순참이 존재하게 된 이유... (0) | 2022.08.05 |