AlamofireObjectMapper を使用してバックエンド サーバーと通信しています。リクエストの 1 つの結果は、次の 2 つの値を含む項目の配列です。
- 2 番目の値 (「arbitraryData」) がどのタイプのデータであるかを示す「typeIdentifier」
- 「任意のデータ」:
- "typeIdentifier" CONTAINS "X" の場合、arbitraryData の型は ArbitraryDataTypeX です
- "typeIdentifier" CONTAINS "Y" の場合、arbitraryData の型は ArbitraryDataTypeY です。
2 つの ArbitraryDataType クラスは共通の祖先を共有していません (Mappable を除く)。プリミティブ型、配列、オプションなどの場合もあります。
適切なタイプを使用して AlamofireObjectMapper に「arbitraryData」フィールドを解析させるにはどうすればよいですか。
次の JSON ファイルを参照してください。
{
"arrayOfItems": [
{
"typeIdentifier": "X",
"arbitraryData":
{
"value": "BLA",
}
},
{
"typeIdentifier": "Y",
"arbitraryData":
{
"anotherValue": "BLUBB",
}
}
]
}
対応する Swing ファイルは次のようになります。
class Item : Mapping {
var typeIdentifier = "X"
var arbitraryData: Mappable? = nil
init?(_ map: Map) {
self.init()
mapping(map)
}
func mapping(map: Map) {
typeIdentifier <- map["typeIdentifier"]
// THIS LINE CONTAINS MY QUESTION: HOW CAN I TELL OBJECTMAPPER, THAT,
// IF typeIdentifier CONTAINS "X", arbitraryData IS OF TYPE
// ArbitraryDataTypeX, AND IF "Y" arbitraryData IS OF TYPE
// ArbitraryDataTypeY?
arbitraryData <- map["arbitraryData"]
}
}
class ArbitraryDataTypeX : Mapping {
var value = "BLA"
init?(_ map: Map) {
self.init()
mapping(map)
}
func mapping(map: Map) {
value <- map["value"]
}
}
class ArbitraryDataTypeY : Mapping {
var anotherValue = "BLUBB"
init?(_ map: Map) {
self.init()
mapping(map)
}
func mapping(map: Map) {
anotherValue <- map["anotherValue"]
}
}
背景情報: AlamofireObjectMapper を使用してバックエンド サーバーと通信しています。リクエストの 1 つの結果は、Item の配列です。typeIdentifier-メカニズム (実際にはもう少し複雑ですが、これは省略しましょう) はバックエンドによって提供され、変更できません。