Tech

Codable 여러 타입 지원하기 (는 사실상 String)

가루군# 2020. 12. 17. 10:35

제곧내고...

 

Codable 을 이용하면 json -> struct 편하게 할수있다 그렇긴한데

내가 편한거지 서버에서 주는 값이 다르면 난해한 케이스가 발생한다

 

예를들어

 

key을 Int로 줄수도있고 String으로 줄수도있고 드릴수도 있습니다.

 

이러면 음~~~... 

 

Codable 은 타입을 지정해줘야하다보니 (물론 찾아보니 AnyType되는 라이브러리 만들긴했더라..) 대충 이렇게 기본적으로 쓰는데

 

struct Sample: Codable {
    var key: String?
}

 

이 구조에 key에 Int 넣으면 터진다

 

펑~

 

struct Sample: Codable {
    var key: String?
    
    init(from decoder: Decoder) throws {
	    let values = try decoder.container(keyedBy: CodingKeys.self)
        if let _str = try? values.decode(String.self, forKey: .key) {
            key = _str
        }
        else if let _int = try? String(values.decode(Int.self, forKey: .key)) {
            key = String(_int)
        }
        else {
            key = nil
        }
    }
    
    enum CodingKeys: String, CodingKey {
        case key
    }
    
}

 

이렇게 써주면 되긴한다. (난 안드릴 수도 있습니다. 가 있어서 nil처리했지만 key에 optional 처리 안할꺼면 throw 으로 터트리자)

 

물론 제일 좋은건 서버에서 여러 케이스 줄꺼면 걍.... string 으로만 주면 고맙겠습니다...