일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Failed to register bundle identifier
- 아이폰
- Modality
- 부트캠프
- UIResponder
- Mock
- NumberFormatter
- 독서후기
- @available
- 야곰아카데미
- 스타트업주니어로살아남기
- roundingMode
- contentInset
- IOS
- SWIFT
- View Life Cycle
- Structures and Classes
- Navigation
- Info.plist
- viewcontroller
- xcode
- 독후감
- Codegen
- NotificationCenter
- 스위프트
- mvvm
- delegation
- human interface guidelines
- SWIFTUI
- 책후기
- Today
- Total
호댕의 iOS 개발
[Swift] DecodingStrategy 본문
JSON 객체에서 데이터 타입의 인스턴스를 디코딩해주는 JSONDecoder에는 기본적으로 decoding에 대한 Strategy가 존재한다.
물론 CodingKey를 사용하여 어떤 식으로 JSON 파일을 디코딩할 지 정해줄 수도 있다.
하지만 일일이 CodingKey를 정해줘야 하는 만큼 만약 이미 정해진 Strategy가 있다면 훨씬 간단하게 디코딩을 해줄 수 있다.
KeyDecodingStrategy
일단 먼저 KeyDecodingStrategy를 살펴보자.
KeyDecodingStrategy는 JSONDecoder에 정의된 열거형으로 그 종류는 3가지가 있다.
- useDefaultKeys: 디코딩할 때 key의 name을 변경하지 않는다.
- convertFromSnakeCase: Snake-Case로 된 key의 name을 Swift에 맞게 Camel-Case로 변경해준다.
- custom: 클로저에 커스텀한 decodingStrategy을 정의해준다.
하지만 KeyDecodingStrategy의 경우 각각의 모든 키를 검사하고 변환해주기 때문에 눈에 띄는 성능 비용이 소모된다.
따라서 거의 대부분의 key를 변환해주는 것이 아니라면 CodingKey 프로토콜을 채택하여 일부만 바꿔주는 것이 성능상으로 이점이 있을 수 있다.
또한 convertFromSnakeCase 공식문서를 보면 다음과 같이 말하고 있다.
The JSONDecoder.KeyDecodingStrategy.convertFromSnakeCase strategy can’t infer capitalization for acronyms or initialisms such as WYSIWYG or URI.
즉 URL 같은 두문자어는 변환을 해줄 수 없다는 것이다.
따라서 KeyDecodingStrategy는 편리하지만 항상 장점만 가지고 있진 않은 것 같다.
😀 장점
1. 따로 CodingKey 프로토콜 없이 Key의 이름을 변경해줄 수 있다.
🥲 단점
1. 모든 키를 각각 검사하고 변환해주기 때문에 성능 비용이 발생한다.
2. convertFromSnakeCase의 경우 두문자어는 표현해줄 수 없다. (항상 프로퍼티 명을 lower-camel-case로 정의해야 한다)
dateDecodingStrategy
이는 JSON 데이터의 날짜에 해당하는 데이터를 Date 타입으로 변환해주는 것이다.
여기서 6가지의 Strategy가 있다.
- deferredToDate: 기본으로 설정된 Strategy이다.
- iso8601: ISO 8601 기준으로 디코딩을 해준다.
이런 형식의 날짜를 Decoding해준다. 즉 1996-01-20T12:30:014 이런 형식의 날짜인 것이다."yyyy-MM-dd'T'HH:mm:ss.SSS"
- formatted: 직접 DateFormatter로 정해준 기준을 넣어주게 된다.
let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SS" JSONDecoder.DateDecodingStrategy = .formatted(formatter)
- custom: 이는 KeyDecodingStrategy처럼 클로저 내부에 커스텀한 디코딩 방식을 작성해주게 된다.
- millisecondsSince1970: 국제 표준시인 UTC를 기준으로 1970.01.01 자정부터 밀리초 단위로 계산한 시간이다.
- secondsSince1970: 국제 표준시인 UTC를 기준으로 1970.01.01 자정부터 초 단위로 계산한 시간이다.
JSON 데이터에 있는 형식에 맞춰 사용해주면 된다.
물론 이런 Strategy들이 항상 좋은 것은 아니지만 상황에만 적절하게 사용해주면 코드의 가독성도 올라가고 간편하게 사용이 가능한 것 같다.
'Software Engineering > Swift' 카테고리의 다른 글
[알고리즘] for 문을 거꾸로 돌 순 없을까? (프로그래머스 문제) (0) | 2022.01.23 |
---|---|
[Swift] for VS forEach (0) | 2022.01.13 |
[자료구조] 단방향 LinkedList 구현해보기 (0) | 2021.12.22 |
[Swift] NumberFormatter roundingMode (1) | 2021.11.21 |
[Swift] 고차함수 map, filter, reduce (0) | 2021.11.21 |