JSON Encode, Decode (3) Enum

woo94·2024년 1월 7일
0

swift

목록 보기
5/5

Swift type이 JSON serialize 되기 위해서는 Codable 로 표기가 되어야 한다. 어떤 type을 codable로 만드느 가장 쉬운 방법은 그것의 property들을 이미 Codable 인 것들로 사용하는 것이다. 이러한 type들에는 String, Int, Double, Date, Data, URL 등이 있다. Property들이 codable인 type은 자동으로 Codable 을 준수하게 된다. 오늘은 특별히 enum은 어떻게 되는지 살펴본다.

Raw representable enums

Enum은 보통 2가지 방법으로 표현된다 -- raw value (IntString) 를 가지거나, associated value 들을 포함하는 것이다.

예를들어 Codable 을 준수하는 String-backed enum을 만들어보자:

enum MediaType: String, Codable {
	case article
    case podcast
    case video
}

이제 위에서 만든 MediaType enum을 다른 Codable type 안에서 사용할 수 있다:

struct Item: Codable {
	var title: String;
    var url: URL;
    var mediaType: MediaType;
}

위의 Item type을 JSON 으로 encode 할 때, 우리는 다음과 같은 결과를 볼 수 있다:

{
  "title": "My item",
  "url": "velog.io/@woo94/posts",
  "mediaType": "podcase"
}

Associated value를 지원하는 enum의 경우는 어떻게 encode, decode 될까?

Associated values

Swift 5.5 이전에는, associated value를 포함하는 enum을 Codable 하게 만들어 주기 위해서는 모든 코드를 수동으로 작성했어야 했다. 하지만 컴파일러가 업그레이드 되어 auto-synthesizing이 가능하게 되었다.

예를 들어 아래의 Video 라는 enum은 custom code가 없이도 Codable 이 될 수 있다:

enum Video: Codable {
	case youTube(id: String)
    case vimeo(id: String)
    case hosted(url: URL)
}

Video 들의 배열을 저장하는 VideoCollection instance를 만들어보자:

struct VideoCollection: Codable {
	var name: String;
    var videos: [Video]
}

let collection = VideoCollection(
	name: "My collection",
    videos: [
    	.youTube(id: "abc123"),
        .vimeo(id: "1234567")
	]
)

위의 collection을 JSON encode를 하면 다음과 같은 결과가 나온다:

{
  "name": "My collection",
  "videos": [
    {
      "youTube": {
        "id": "abc123"
      }
    },
    {
      "vimeo": {
        "id": "1234567
      }
    }
  ]
}

Unlabelled associated value의 경우에는 underscored numeric key(_0, _1,과 같은) 이 기본으로 사용된다.

참조

https://www.swiftbysundell.com/articles/codable-synthesis-for-swift-enums/
https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

profile
SwiftUI, node.js와 지독하게 엮인 사이입니다.

0개의 댓글

관련 채용 정보