Codable

나이든별 / Oldstar·2022년 6월 27일
0

Think about Keywords

목록 보기
30/37

공부한 것

  • Codable
    • Decodable
    • Encodable

고민한 점 및 생각해본 점

  • 먼저 Decodable에 대해 알아보자. 공식 문서에 따르면, 외부 표현으로부터 자기 자신을 디코딩할 수 있는 타입이라고 한다.
  • 그러면 디코딩은 무엇인가? 복호화이다. 사전적으로는, 컴퓨터가 알아들을 수 있는 0과 1을 사람이 알아들을 수 있는 언어로 바꾸는 것이다.
    • 편의를 위해 앱 내부와 앱 외부로 공간을 분리했을 때, 앱 내부에서 쓸 수 있는 타입으로의 변환 과정이라고 할 수 있다.
  • Encodable은 공식 문서에 따르면, 외부 표현으로 자신을 인코딩할 수 있는 타입이다.
  • 역시 사전적 정의는 암호화, 코드화. 컴퓨터에서는, 인간의 언어를 컴퓨터가 알아들을 수 있는 0과 1로 바꿔 주는 작업이다.
    • 마찬가지로, '외부 표현'을 여기서는 앱 외부 공간에서 사용되는 데이터 형식, 예를 들면 JSON이라고 할 수 있다.
  • 즉, EncodableDecodable은 앱이 외부와 데이터를 주고받기 위해 필수적인 프로토콜이다.
  • 그럼 Codable은 뭐냐? 놀랍게도, DecodableEncodable을 함께 묶어서 칭하는 typealias이다..
    • 즉, Codable을 적용하면 DecodableEncodable을 같이 적용한 것과 완전히 같다는 것이다.
    • 생각해보면 당연한 것이지만, 설마 typealias였을 줄이야.
  • 모델링을 할 때 Codable을 붙여줌으로써 간단히 외부와 통신할 수 있는 자료형을 만들 수 있다.
    • 물론, CodingKey를 통한 외부 표현과의 올바른 매칭이 필요할 수도 있지만..
    • 단, 이렇게 Codable하게 만들려면, 타입 안에 들어가는 프로퍼티들이 전부 Codable을 만족해야 한다.
    • 기본 자료형인 StringInt 등은 기본적으로 Codable을 만족하기 때문에, 해당 속성의 프로퍼티로만 이루어진 타입은 바로 Codable을 적용할 수 있다.
  • Codable하지 않은 프로퍼티나 타입 등을 Codable하게 만들어 주기 위해 몇 가지 선택지가 있다.
  • 먼저, 연산 프로퍼티를 사용할 수 있다. 연산 프로퍼티는 인스턴스 이니셜라이징 과정에서는 값이 미리 할당되지 않기 때문에 가능한 일.
    • 특정 타입에서 String 형식의 이미지 이름 프로퍼티와, 해당 프로퍼티를 기반으로 한 URL을 사용해 이미지를 가져와 UIImage를 반환하는 연산 프로퍼티를 가지고 있다는 것을 상상해보면 쉽다.
struct Information: Codable {
    let name: String
    let imageName: String

    var thumbnail: UIImage? {
        let url = URL(String: Path.baseURL + imageName)
        let data = Data(contentsOf: url!)
        let image = UIImage(data: data)
        return image
    }
}
  • 다음으로, 자신만의 wrapper 자료형을 만드는 방법이 있다. Codable하지 않은 것을 이니셜라이저로 받아서 Codable한 결과를 돌려주는 인스턴스.
  • Codable하게 만들고자 하는 타입에 extension을 통해 Encodableencode(to: Encoder) throws 메서드와, Decodableinit?(from: Decoder) throws 이니셜라이저를 구현해도 되겠다.

참조

https://developer.apple.com/documentation/swift/encodable
https://developer.apple.com/documentation/swift/decodable
https://developer.apple.com/documentation/swift/codable
https://developer.apple.com/documentation/foundation/url/3126806-init
https://stackoverflow.com/questions/46197785/how-to-conform-uiimage-to-codable

profile
함께 나아가고자 하는 사람

0개의 댓글