UIKit์ ์ฌ์ฉํด์ ์ฑ์ ๋ง๋ค ๋ ์๋ ์ฝ๋๋ฅผ ํ์์ ์ผ๋ก ์ ์ด์ผ๋ง ํ๋ค. ๊ณผ์ฐ ์ด ์ฝ๋๊ฐ ์๋ฏธํ๋๊ฒ ๋ญ๊ณ ์ ์ ์ด์ผํ ๊น?
๐ฃ ์์์ฝ๋
init(frame: CGRect, data: Data) {
self.data = data
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
- ์ฌ๊ธฐ์ ์ง์ ํด์ค init์ ๋ญ๊น?
๐ฃ init(frame: )
https://developer.apple.com/documentation/uikit/uiview/1622488-init
๐ช ๊ณต์๋ฌธ์๋ฅผ ๋จผ์ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ์๋์ด ์๋ค.
๐๐ป Initializes and returns a newly allocated view object with the specified frame rectangle.
→ ์ง์ ๋ ํ๋ ์ ์ง์ฌ๊ฐํ์ ์ฌ์ฉํ์ฌ ์๋ก ํ ๋น๋ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ณ ๋ฐํํฉ๋๋ค.
๐ช ์ค๋ช
์ฝ๋๋ก UIView Class์ View ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ง์ ๋ ์ด๋์ ๋ผ์ด์
→ Frame rectangle์ ๊ฐ์ง๊ณ ๊ตฌํํ๊ณ ์ ํ๋ ๋ทฐ์ ์ค์ฌ๊ณผ ๊ฒฝ๊ณ์ ์ ์ง์ ํด์ค๋ค. ์คํ ๋ฆฌ๋ณด๋, xib, nib ๊ฐ์ ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฝ๋๋ก UIView Calss์ View object๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ง์ ๋ ์ด๋์ ๋ผ์ด์ ๋ค.
๐ฃ init(coder: )
https://developer.apple.com/documentation/foundation/nscoding/1416145-init
๐ช ๊ณต์๋ฌธ์๋ฅผ ๋จผ์ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ์๋์ด ์๋ค.
๐๐ป Returns an object initialized from data in a given unarchiver.
→ ์ง์ ๋ unarchiver์ ๋ฐ์ดํฐ์์ ์ด๊ธฐํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
๐ช unarchaiver๊ฐ ๋ญ๊น?
UIKit์์๋ storyboard์ xib๋ฅผ ํ์ฉํด์ view๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด ํด์ ํ์ฉํ๋ฉด ๋ณ๋์ ์ฝ๋ ์์ฑ ์์ด ์ฑ์ ์์ฑ์ ์์ ํ ์ ์๋๋ฐ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ์ unarchiving ์ด๋ผ๊ณ ํ๋ค.
์ด ํด๋ค์ (interface builder) ์ฝ๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฑ์ ์ปดํ์ผ ํ๋ ์์ ์์ ์ปดํ์ผ๋ฌ๊ฐ ์ธ์ํ ์ ์๊ณ ์ด๋ฅผ ์ฝ๋๋ก ๋ณํํด์ฃผ๋ unarchiving ๊ณผ์ ์ด ํ์ํ๋ค. → ์ด ๊ณผ์ ์์ ๋ฐ๋ก init(coder: )๊ฐ ํ์ํ๋ค!
๐ช init(coder: )
ํ๋ผ๋ฏธํฐ coder๋ฅผ ํตํด์ NSCoder ํ์ ์ ๊ฐ์ฒด๊ฐ ์ ๋ฌ๋๋ค. ์ ๋ฌ๋ NSCoderํ์ ์ ๊ฐ์ฒด๊ฐ decoding๋์ด ์ด๊ธฐํ๋ ํ ์ปดํ์ผ ํ ์ ์๊ฒ decoding๋ ์๊ธฐ์์ (self)์ ๋ฐํํ๋ ์์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ง์ ๊ตฌ์ฑํ View์ ์ํ๋ฅผ ์ฑ์ disk์ ์ ์ฅํ๋ ๊ณผ์ ์ serialize๋ผ๊ณ ํ๋ค. deserialize๋ ๋ฐ๋๋ก disk์ ์ ์ฅ๋ ์ํ๋ฅผ ๋ถ๋ฌ์ค๋ ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. NSCoding์ด๋ผ๋ ํ๋กํ ์ฝ์ ํตํด ์ด serialize์ deserialize ์์ ์ด ๊ฐ๋ฅํด์ง๋ค.
์ฆ ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.
โ Storyboard๋ผ๋ ์ธํฐํ์ด์ค ๋น๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ์ ์ํ๋ฅผ ์์ ํ ๊ฒฝ์ฐ serialization ์์ ์ Xcode๊ฐ init(coder:)๋ฅผ ํธ์ถํ์ฌ ์ฑ ๋ด ๋ทฐ ์์ ์ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ์์ ์ ํด์ค๋ค.
๐ช requiered๋ก ์ ์ธ๋ ์ด์ ?
UIView ์ ์ธ๋ถ๋ฅผ ๋ณด๋ฉด NSCoding ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์๋๋ฐ NSCoding ์ ์ธ๋ถ๋ฅผ ์ดํด๋ณด๋ฉด ์คํจ๊ฐ๋ฅํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์์ฑํ๋๋ก ๋์ด์๋ค.
ํ๋กํ ์ฝ์ ์ค์ํ๋ ํด๋์ค์์ ํ๋กํ ์ฝ์์ ์๊ตฌํ๋ ์ด๋์ ๋ผ์ด์ ์๊ตฌ์ฌํญ์ ๊ตฌํํ๋ ค๋ฉด required ํค์๋๊ฐ ๋ถ์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์์๋ฐ์ ์ปค์คํ ๋ทฐ์ ๊ฐ์ ํด๋์ค์์๋ ์คํ ๋ฆฌ๋ณด๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์ง๋ง init?(coder:)๋ฅผ ๊ตฌํํด์ค์ผ ํ๊ณ ์์ ๊ผญ required๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค. ๐ code-base ์ธ๋ฐ init(coder: )๊ฐ ํ์ํ ์ด์
๐ Reference
https://leeari95.tistory.com/63?category=961651
https://velog.io/@inwoodev/iOS-initframe-initcoder