Swift/UIKit

[UIKit] init(frame: ), init(coder: ) μ΄λ‹ˆμ…œλΌμ΄μ €

감자 πŸ₯” 2022. 7. 10. 14:45
λ°˜μ‘ν˜•

 

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

 

Apple Developer Documentation

 

developer.apple.com

 

πŸŸͺ κ³΅μ‹λ¬Έμ„œλ₯Ό λ¨Όμ € μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ 같이 μ •μ˜λ˜μ–΄ μžˆλ‹€.

πŸ‘‰πŸ» 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

 

Apple Developer Documentation

 

developer.apple.com

 

πŸŸͺ κ³΅μ‹λ¬Έμ„œλ₯Ό λ¨Όμ € μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ 같이 μ •μ˜λ˜μ–΄ μžˆλ‹€.

πŸ‘‰πŸ» 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 

 

[iOS/UIKit] init(frame:)와 init(coder:)

UIView μš”μ†Œλ₯Ό μ½”λ“œλ‘œ 직접 μ»€μŠ€ν…€ν•˜μ—¬ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ§Œλ“€λ˜ 와쀑에 override μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ required μ΄λ‹ˆμ…œλΌμ΄μ €, 총 2개의 μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ •μ˜ν•΄μ•Όν•œλ‹€λŠ” 것을 μ•Œκ²Œλ˜μ—ˆλ‹€. override init(frame: CGRec

leeari95.tistory.com

https://velog.io/@inwoodev/iOS-initframe-initcoder

 

[iOS] init(frame:), init(coder:)

μŠ€ν† λ¦¬λ³΄λ“œ 없이 앱을 λ§Œλ“€λ‹€ 보면 μ•„λž˜μ™€ 같은 override init(frame:) κ³Ό required init?(coder:) 이 ν•„μš”ν•œ 것을 μ•Œ 수 μžˆλ‹€.λ‹¨μˆœνžˆ ν•„μš”ν•΄μ„œ μ»μ—ˆμ§€ μ™œ ν•„μš”ν•œμ§€λŠ” μ œλŒ€λ‘œ μ•Œμ•„λ³΄μ§€ μ•Šμ€ 것 κ°™μ•„μ„œ κ³΅λΆ€ν•œ

velog.io

 

λ°˜μ‘ν˜•