티스토리 뷰

Mobile/iOS

Swift. Codable Decoding (2)

out of coding 2018. 10. 7. 10:28

이전글 http://mrgamza.tistory.com/562 에서 아주 간단한 방법으로 json을 파싱하는 방법을 알아보았습니다.


그래서 제 입장에서도 이것저것 하다가 느낀점과 추가되어야 할 부분에 대해서 적어봅니다.


그냥 아주 간단한 내용만 적어볼까 합니다.


더 자세한 extension 같은것들은 블로그에서 다루지 않도록 하겠습니다.


아마 이번 글 이후에 적게 되겠죠?


이전 글은 일반적으로 서버에서 주는 json의 key값을 이용하여 decoding 하도록 하는 예제였습니다.



서버에서 주는 값과 우리가 사용하는 값을 다르게 할수 없을까?


이전에 사용하던 ObjectMapper같은 경우에는 거의 무조건 값을 매핑하여 주는 방법으로 사용을 하였습니다.

그래서 response data에 스네이크 형태로 내려와도 그것을 우리가 원하는 낙타형태로 변경하여서 사용을 하였습니다.

일반적으로 이런것들은 그냥 사용을 하여도 됩니다.


하지만 swift의 단말 소스는 거의 일반적으로 스네이트를 사용하지 않습니다.

이것이 굉장히 보기 싫을 경우도 있을것이고 이것을 좋아하지 않는 사람도 있을것입니다.

물론 파이썬이나 기타 언어들에서는 언더바로 변수명을 만들기 때문에 이러한 현상들이 일어나는것 같습니다.


1
2
3
4
5
6
7
struct Exam : Codable {
    var userId: String?
 
    enum CodingKeys: String, CodingKey {
        case userId = "user_id"
    }
}
cs


이것은 서버에서는 user_id로 줄 경우에 userId로 값을 받고 싶을때 사용합니다.

그런데... 잠시 보고 있으면 웬지 ObjectMapper를 바라보는것 같아서 참 안타까울수가 없네요.


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
31
32
33
34
// Json Data
{
    "user_id""DH",
    "address": {
        "first""Korea",
        "second""Seoul"
    }
}
 
// Code
struct Exam {
    var userId: String?
    var address: String?
 
    enum CodingKeys: String, CodingKey {
        case userId = "user_id"
        case address
    }
 
    enum AddressKeys: String, CodingKey {
        case first
        case second
    }
}
 
extension Exam : Decodable {
    init(from decoder: Decoder) throws {
        let codingKeys = try decoder.container(keyedBy: CodingKeys.self)
        userId = try codingKeys.decode(String, forKey: .userId)
 
        let addressKeys = try codingKeys.nestedContainer(keyedBy: AddressKeys.self)
        address = try addressKeys.decode(String.self, .first)
    }
}
cs


json 내부의 값을 자신이 커스텀해서 가져올수도 있습니다.

위의 예제와 거의 비슷한 부분들은 enum을 이용하여서 값을 빼서 가져오고 이것을 decode하여서 넣어준다는것입니다.


개인적으로는 어쩔수 없는 상황에서는 사용하더라도 전체적으로 이렇게 바뀐다면 의미가 없다고 생각합니다.


또한 extension 한 부분이 Decodable이어서, Exam struct를 변수처럼 가져다가 사용하는 상위 struct가 있다고 한다면 그곳 또한 Decodable이 되어야 합니다.


이유는 Codable은 생성자가 따로 존재하여서 Encode, Decode에 대한 부분들이 코드상에 정의가 되어 있어야 합니다.

그래서 이것을 구현하지 않아서 발생하는 문제입니다.


말이 어렵나요. ㅎ 아무튼 커스텀하고 싶다면 init을 이용하여서 구현하여야 합니다.


다음에는 Key가 없거나 Value가 없는 타입에 대한 처리 방법에 대해서 적어볼까 합니다.


조만간 적어볼게요.

'Mobile > iOS' 카테고리의 다른 글

print, debugPrint  (0) 2018.12.10
iOS. Associated References로 임의 객체 저장  (0) 2018.10.16
iOS. swift defer  (0) 2018.09.01
iOS. Custom View 만들기  (0) 2018.08.14
Swift. AVPlayer 이용하기  (0) 2018.07.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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 31
글 보관함