새싹

SPM으로 SnapKit을 추가하고 UIView를 상속받을때 Import Snapkit을 하지 않아도 되는 이유!

Thor_yeom 2023. 8. 29. 02:17

모두 한번쯤은 사용 해본 SnapKit에 대해 

파헤쳐보겠습니다.

 

바로 본론으로 들어가서

해당 View에 import SnapKit을 해주지 않았는데 해당 View를 상속 받으면 

Snapkit이 사용 가능한것에 의문이 들었습니다.

 

어떻게 이게 가능한걸까요?

 

VC에만 import Snapkit을 해주긴했지만 

이것 때문일까요?

 

네! 그래서 찾아봤습니다.

일단 SnapKit의 정의에 대해 봤는데요

정의 첫줄에 희한한게 있었습니다 ( 원래 가장 첫줄이 중요한거 아시죠? )

 == 는 연산자인데... lhs, rhs 뭔가 left,  right를 나타내는거 같은 느낌이었고

 

코드를 해석해보자면...

 

왼쪽과 오른쪽 타입이 같은지 보고 결과로 Bool로 줘

 

그럼 또 Snapkit.ConstraintItem은 뭘까요

더이상 상속이 안되게 final로 막혀져 있네요 

 

그 아래에는 Extension으로 확장이 이뤄지고 있습니다.

 

 

그렇다면 SnapKit.ConstraintRelatableTarget 얘는 누굴까요?

이렇게만 정의되어 있네요...

 

그렇다면 어디에 쓰이는지 확인해보겠습니다.

 

자주 사용했던 메소드 안에 자료형으로 있었네요...

뭔가 느낌이 해당 VIew 자체를 나타내는거 처럼 보이지 않나요??

 

네 공식문서를 보면 

eqaulTo 안에 superView가 들어가 있는 것을 알 수 있습니다.

superView == 해당 View

 

 

 

살짝 감이 잡히시나요 처음에 의문을 가졌던 코드를 보면 

현재 프로젝트 내에서 import SnapKit을 하면 해당 자료형과 같은 것은 

SnapKit이 자동으로 적용된다는 것입니다.

 

확인을 해보면 

 

자료형이  UIVIewController인 곳에 SnapKit을 import했습니다.

앞서 설명드린대로 UIViewController과 같은 자료형이면 SnapKit이 자동 적용 됩니다.

 

근데 말입니다... 혹시 UIVIewController가 어떻게 구성되어 있는지 아시나요?

그 중에서 UIResponder를 보면...

근본좌 NSObject로 구성되어 있습니다.

 

그렇기 때문에 NSObject로 구성된 모든 것에

SnapKit을 적용할 수 있습니다. 

 

몇 가지 예시를 보여드리겠습니다.

아니? 어떻게 가능한거죠?

자료형이 UIVIew이지만 UIVIew또한 NSObject를 상속 받은 UIResponder를 가지고 있습니다.

( 어휴... 애는 더 많네요...)

 

그렇가면  UIButton은 어떨까요?

 

버튼은 NSCoding을 가지고 있네요 

 

 

이렇기 때문에 Base View or VC를 만들때 한곳에만

import Snapkit을 해도 모든 곳에서 

사용할 수 있다는 것을 알 수 있습니다.

 

 

혹시 내용이 틀리거나 보안해야할 부분 있으면 댓글 부탁드립니다^^

 

 

이상 먼저해보고 대신해보는 아무개발자 이었습니다.