ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NSCoder
    Swift 2021. 12. 27. 15:28

    안녕하세요.

     

    오늘은 NSCoder에 대해서 알아보도록 하겠습니다.

     

    아마 Custom View를 만들어보신 분들이라면 한 번쯤은 보신 친구일텐데요.

     

    CustomView에 생성자를 만들게 되면 이런 에러가 발생하시는 것을 보셨을 거에요.

     

    아니 view만드는데 frame만 있으면 되는거 아닌가?

    왜 이상한 실패가능한 생성자를 만들라는거지??

    라고 생각하고 그냥 Fix버튼 눌러서 fatalError를 작성하고는 했었는데요.

     

    과연 저 함수가 왜 필요한지

    도대체 NSCoder가 무엇인지 이번 기회에 알아보도록 하겠습니다.


    NSCoder

    https://developer.apple.com/documentation/foundation/nscoder

     

    Apple Developer Documentation

     

    developer.apple.com

     

    공식 문서에서는 다른 객체의 아카이빙 빛 배포를 가능하게 하는 토대를 제공하는 추상 클래스라고 하네요.

     

    이것만 봐서는 무슨 소린지 잘 모르겠네요.

     

    아까 UIView를 만들 때 어떤 프로토콜 때문에 init?(coder: NSCoder)가 필요한지 확인해보는게 좋을 것 같아요.

     

    UIView의 정의를 살펴보면

    이렇게 굉장히 많은 프로토콜을 채택하고 있는데요.

     

    저기 NSCoding이라는 프로토콜이 수상하지 않나요?

    저희의 생각이 맞았네요.

     

    그럼 NSCoder를 알기 전에 우선 이 NSCoding부터 알고 가는게 좋을 것 같네요.

     

    https://developer.apple.com/documentation/foundation/nscoding

     

    Apple Developer Documentation

     

    developer.apple.com

    아카이빙과 배포를 위해서 객체를 인코딩과 디코딩 할 수 있는 프로토콜이라고 합니다.

     

    이제 좀 알아들을 수 있는 거 같죠?

     

    인코딩은 데이터를 다른 형태로 변환시키는 것을 의미하는데요.

    디코딩은 그 반대 과정을 의미하고요.

     

    예를 들어서 앱에서 사용하던 클래스 또는 구조체를 JSON 파일로 변환시키는 것은 인코딩이라고 할 수 있어요.

    반대로 디코딩은 JSON파일을 클래스나 구조체로 바꾸는 것을 말하겠죠?

     

    NSCoding을 채택한다면 위에 나와있는데로

    encode(with coder: NSCoder)init?(coder: NSCoder)만 구현하면 됩니다.

     

    encode는 말그대로 인코딩을 위한 메소드일 것이고, 그렇다면 생성자가 디코딩 역할을 담당하겠죠.

     

    NSCoder를 그럼 이제 좀 알 것 같아요.

    바로 인코딩과 디코딩을 해주는 주체라는 사실을요.

     

    직접 한번 클래스를 만들어보면서 알아봅시다!

    이런 식으로 클래스를 만들었습니다. 

     

    NSSecureCoding은 NSKeyedUnarchiver.unarchivedObject(ofClass:from:) 메소드를 사용하기 위해 필요하더라고요ㅠ

     

    기존에는 NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archiveTest)를 통해서 언아카이빙했었는데

    이게 곧 deprecated 된다고 하네요..

    NSSecureCoding 프로토콜은 나중에 공부해보도록 하겠습니다.

    Integer와 String을 가지고 있는 클래스입니다.

    그럼 작성한 encode함수와 init?(coder: NSCoder)함수가 어떻게 쓰이냐

    이런 식으로 사용하면 됩니다.

    바로 저 NSKeyedArchiver와 NSKeyedUnarchiver가 NSCoder입니다.

    이 NSCoder들이 각각 encode 메소드와 init을 호출해서 아카이빙과 언아카이빙을 하고 있는 것이죠.
     
    CustomView 생성자에서 원하던 NSCoder는??

    커스텀 뷰를 만들고

    Xib를 통해 view를 생성해보겠습니다.

    coder를 출력했을 때 위와 같이 UINibDecoder라는 친구가 출력되는 것을 확인할 수 있습니다.

     

    스토리보드와 마찬가지로 xib의 경우도 xml 파일이자나요.

     

    해당 파일을 view로 만들기 위해서 UINibDecoder가 사용되는 것입니다.


    오늘은 NSCoder와 NSCoding에 대해서 알아보았는데요.

     

    NSCoding은 구조체에는 사용이 불가능합니다. 구조체에 사용하기 위해서는 Codable 프로토콜을 사용해야 하는데요.

     

    Codable프로토콜은 다음 시간에 공부해보도록 하겠습니다.

    'Swift' 카테고리의 다른 글

    SOLID 원칙  (0) 2022.01.28
    Codable  (0) 2021.12.28
    escaping closure(탈출 클로저)  (0) 2021.12.23
    Hashable  (0) 2021.12.17
    String은 왜 Int로 Subscript 되지 않을까?  (0) 2021.12.15
Designed by Tistory.