2017-09-09 3 views
1

나는 코드화 된 프로토콜 (EVReflection 대신 사용할 수있게 변환 한 코드)을 변환하는 과정에있는 Swift 앱을 가지고 있습니다. 더 이상 효과를 발휘하지 못함). 앱 서버로 트랜잭션 할 때, 내 코드는 여러 변수를 포함하는 "ServerResponse"클래스의 객체를 생성합니다.이 중 하나는 "responseObject"입니다.이 객체는 사용자, 메시지 또는 다른 객체의 임의 개수 일 수 있습니다. 다른 사람. Codable은 기본적으로 "decodeIfPresent"를 사용하지 않기 때문에 특정 트랜잭션 중에 오류가 발생하여이를 방지하기 위해 init (Decoder : Decoder)를 재정의해야했습니다. 이제 나중에 호출 메서드로 올바른 객체 유형으로 디코딩하기 위해 원시 JSON 문자열을 그대로 남겨 두는 방법이나 다른 유사한 수정 방법을 알아내는 문제를 해결해야합니다. 결론 : 유연하고 내 서버가 보내는 모든 유형의 객체를 허용하려면 responseObject가 필요합니다.스위프트 4 - 코드 가능 - 디코딩 할 때 키에 대해 다양한 객체 유형을 허용하는 방법

누구든지 의견이 있으면 감사드립니다. 도움이된다면 코드를 공유해 드리겠습니다.하지만이 질문은 본질적으로 개념적이기 때문에 생각하지 않았습니다.

다음
struct CustomAttribute: Codable { 
var attributeCode: String? 
var intValue: Int? 
var stringValue: String? 
var stringArrayValue: [String]? 

enum CodingKeys: String, CodingKey { 

    case attributeCode = "attribute_code" 
    case intValue = "value" 
    case stringValue 
    case stringArrayValue 
} 

init(from decoder: Decoder) throws { 
    let values = try decoder.container(keyedBy: CodingKeys.self) 

    attributeCode = try values.decode(String.self, forKey: .attributeCode) 
    if let string = try? values.decode(String.self, forKey: .intValue) { 
     stringValue = string 
    } else if let int = try? values.decode(Int.self, forKey: .intValue) { 
     intValue = int 
    } else if let intArray = try? values.decode([String].self, forKey: .intValue) { 
     stringArrayValue = intArray 
    } 
} 

} 

값 세 가지 유형이 될 수 있으며, 내가 수동으로이 유형 식별 -이 :

+0

여러 가지 유형 중 하나 일 수있는 코드를 디코딩하려고 시도하는 일반적인 해결책은 유형을 하나의 유형으로 디코딩하려고 시도하고 유형이 일치하지 않아 실패하는 경우 다음 유형을 시도하십시오. 'responseObject'는 이와 같은 것입니까, 아니면 완전히 제약되지 않은 타입입니까? JSON 페이로드가 어떻게 생겼는지에 대한 구체적인 예를 들려 줄 수 있습니까? –

+0

완벽하게 통제되지는 않았지만이 시점에서 34 가지 종류의 객체가 전달 될 수 있습니다. 내가 진정으로 원하는 것은 원시 JSON을 완전히 그대로 놔두고 호출 메소드에서 수동으로 디코딩 할 수 있도록하는 것입니다. 그렇게 할 수있는 방법이 있습니까? – Joel

+1

지금은 아니요. 현재 고려중인 기능입니다. –

답변

2

이 비슷한 작업을 수행 할 수 있습니다.