ObjectMapper条件映射整个元素

时间:2017-03-08 12:29:03

标签: ios swift swift3 objectmapper

我有一个自定义的ObjectMapper类。 我想根据数据将元素映射到不同的对象类型。 我已经实现了如下的逻辑。但是它没有给我这些值,只有null。

class FeedObject : Object, Mappable {

    dynamic var post : HomeDataModel?
    dynamic var friends : Friends?

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        var Mtype = ""
        Mtype <- map["type"]
        print("TYPEEEEEE", Mtype)

        if Mtype == "FRIENDS" {
            friends <- map
        }
        else {
            post <- map
        }
    }
}

如何实现这种映射?

示例Json -

{ "feed_objects": [ { "type": "NORMAL", "status": "none", "invited": false, "comment": "hello", "time": "00:12" }, { "type": "NORMAL", "status": "none", "invited": true, "comment": "How are you?", "time": "04:15" }, { "type": "FRIENDS", "display_text": "Your friends are here.", "count": 23 }, { "type": "NORMAL", "status": "verified", "invited": true, "comment": "great", "time": "09:32" }] }

2 个答案:

答案 0 :(得分:0)

  

我认为你应该存储整个数组对象。

在这里,让我们转到您正在获得响应的Web服务解析方法。

if let responseValue = response.result.value as? [String:AnyObject]{ 
    if let feedObject = Mapper<Feed>().mapArray(JSONArray:data){
             print(feedObject)
    }
}

定义您的Feed类是这样的。

import ObjectMapper

class Feed: Mappable, CustomStringConvertible {

    required init?(map: Map) {}

    func mapping(map: Map) {
        type <- map["type"]
        status <- map["status"]
        comment <- map["comment"]
        time <- map["time"]
        invited <- map["invited"]
    }

    var description: String {
        get {
            return Mapper().toJSONString(self, prettyPrint: false)!
        }
    }

     var type:String = String()
     var status:String = String()
     var comment:String = String()
     var time:String = String()
     var invited : Bool = Bool()

}

之后,您可以遍历数组对象并比较类型。如果您需要任何进一步的帮助,请告诉我。

答案 1 :(得分:0)

Anil的答案不是正确/有效的方法,您将在一次映射迭代后重新处理数据集。 您需要为映射定义自己的变换。检查一下:How to map different type using ObjectMapper?