2017-09-09 4 views
1

私は、コーディング可能なプロトコル(EVReflectionではなく、私ができるほどに変更したもの)を使用するために、もはやそれを働かせない)。アプリケーションサーバーとトランザクションするとき、私のコードは、クラス "ServerResponse"のオブジェクトを生成します。このオブジェクトには、複数の変数が含まれています。そのうちの1つは "responseObject"です。ユーザーからメッセージへの任意の数の異なるオブジェクトその他。 Codableはデフォルトで「decodeIfPresent」を使用しないため、特定のトランザクションでエラーが発生していましたが、これを防ぐためにinit(デコーダ:デコーダ)をオーバーライドする必要がありました。今度は、呼び出し元のメソッドによって後で正しいオブジェクト型にデコードするための生のJSON文字列をそのまま残すか、または他の同様の修正を行う方法を考え出すという難題が残っています。結論:私は柔軟性があり、私のサーバーが送信する任意のタイプのオブジェクトを許可するためにresponseObjectが必要です。Swift 4 - コーディング可能 - デコード時にキーにさまざまなオブジェクトタイプを許可する方法

誰かが何か提案があれば、私は感謝します。それが助けになるなら、私はコードを共有することを喜んでしますが、この質問は本質的に概念的なものであるので、私はそれができないと思いました。

+0

いくつかのタイプのうちの1つであるかもしれないものを解読しようとする一般的な解決方法は、それを1つのタイプとして解読しようとすることであり、タイプの不一致により失敗した場合は次のタイプを試みます。 'responseObject'はこれと似ていますか、まったく制約のないタイプですか? JSONペイロードの外観を具体的に例を挙げて教えてください。 –

+0

それは完全には拘束されていませんが、渡すことができる私のアプリのこの時点で34種類のオブジェクトがあります。私が本当に好きなのは、生のJSONを完全にそのままにしておき、呼び出しメソッドから手動でデコードできるようにすることです。それを行う方法はありますか? – Joel

+1

現時点ではありません。これは現在、検討中の機能です。 –

答えて

2

あなたは、これに似たような行うことができます - 値は3種類のものとすることができ、私は手動でそれがどのタイプの識別ここで

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 
    } 
} 

} 

を。

関連する問題