2016-08-17 36 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

很抱歉,但你裏面的這個模型項目?如果不存在,則不能映射類型。如果您想要映射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