0

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-メカニズム (実際にはもう少し複雑ですが、これは省略しましょう) はバックエンドによって提供され、変更できません。

4

1 に答える 1