2016-08-17 7 views
2

APIからマルチタイプオブジェクトの応答JSONがあります。オブジェクトマッパー - [AnyObject]の配列を解析する

内部にtypeというプロパティがあります。今私はtypeプロパティに基づく何らかの自動マッピングを適用しようとしていますが、どのような方法でも機能させることはできません。私は取得しています

private let modelClassMap = [ 
    "first_type": First.self 
] 

func createModelWithDictionary(json: [String: AnyObject]) -> [AnyObject] { 
    var items: [AnyObject] 
    if let items = json["items"] as? [[String: AnyObject]] { 
     for item in items { 
      if let typeString = item["type"] as? String { 
       var Type = self.modelClassMap[typeString] 
       items.append(Mapper<Type>().map(item)) 
      } 
     } 
    } 
    return items 
} 

エラーは、テンプレートの関連タイプは、ランタイムされていないので、あなたが何をしようとしてType is not a type

+0

申し訳ありませんが、あなたは内部でこのモデルを持っていますプロジェクト? Typeがすでに存在しない場合はマッピングできません。あなたのJsonに記述されている新しいタイプをマップしたい場合は、方法が長すぎます。 – Patonz

+0

@Patonz - はい。それらは既存のマップ可能オブジェクトです。 – yershuachu

答えて

1

が、実際には不可能であることです。コンパイラはコンパイル時に型を知る必要があります。

私たちは、列挙型使用して、少し違ったことを行うことができます。

enum ModelClassMap: String { 
    case FirstType = "first_type" 

    func map(item: [String: AnyObject]) -> AnyObject? { 
     switch self { 
     case FirstType: 
      return Mapper<First>().map(item) 
     } 
    } 
} 

そして、あなたのforループでは、あなたが列挙型に文字列を変換しようとすることができた:

func createModelWithDictionary(json: [String: AnyObject]) -> [AnyObject] { 
    var mappedItems: [AnyObject] = [] 
    if let items = json["items"] as? [[String: AnyObject]] { 
     items.forEach() { 
      if let typeString = $0["type"] as? String, 
       let mappedType = ModelClassMap(rawValue: typeString), 
       let mappedObject = mappedType.map($0) { 
       // mappedObject represents an instance of required object, represented by "type" 
       mappedItems.append(mappedObject) 
      } 
     } 
    } 
    return mappedItems 
} 
+0

これは私が想定したものです。答えてくれてありがとう。 私は単純なスイッチのどちらのマップにも固執しています。 – yershuachu