Swift type이 JSON serialize 되기 위해서는 Codable
로 표기가 되어야 한다. 어떤 type을 codable로 만드느 가장 쉬운 방법은 그것의 property들을 이미 Codable
인 것들로 사용하는 것이다. 이러한 type들에는 String
, Int
, Double
, Date
, Data
, URL
등이 있다. Property들이 codable인 type은 자동으로 Codable
을 준수하게 된다. 오늘은 특별히 enum은 어떻게 되는지 살펴본다.
Enum은 보통 2가지 방법으로 표현된다 -- raw value (Int
나 String
) 를 가지거나, 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 될까?
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