Alamofire ObjectMapper - извлекает общие поля из всех моделей и отображает их - PullRequest
0 голосов
/ 07 мая 2018

Существует несколько полей, общих для всех моделей, возвращаемых API. Но они не приходят как отдельный объект. Они там среди других областей.

Пример двух моделей:

Событие:

[  
   {  
      "event":{  
         "id":3,
         "company_id":18,
         "archived":false,
         "created_by":229,
         "updated_by":229,
         "owner_id":229,
         "subject":"",
         "start_date":null,
         "end_date":null,
         "name":null,
         "name_class_name":"",
         "related_to":null,
         "related_to_class_name":"",
         "status":"",
         "created_at":"2018-05-07T01:59:38.921-04:00",
         "updated_at":"2018-05-07T01:59:38.921-04:00",
         "custom_nf":false
      }
   }
]  

Возможность:

[  
   {  
      "opportunity":{  
         "id":4,
         "company_id":18,
         "archived":false,
         "created_by":229,
         "updated_by":229,
         "owner_id":229,
         "account_id":null,
         "name":"",
         "lead_source":"",
         "amount":null,
         "close_date":null,
         "probability":null,
         "stage":"",
         "created_at":"2018-05-07T01:49:55.441-04:00",
         "updated_at":"2018-05-07T01:49:55.441-04:00"
      }
   }
]

Как показано, начальные поля являются общими в обеих (всех) моделях - id, company_id, в архиве, create_by и т. Д.
Есть тонны проектов, с которыми я работал ObjectMapper , но раньше с этим не сталкивался. Я полностью осведомлен о работе с вложенными моделями, но это другой случай.
Хотя я могу легко справиться с этим, повторяя все общие поля во всех моделях. Но это звучит не очень хорошо .
Я ищу способ создания отдельного класса модели со всеми общими полями. Но вопрос в - как мне сопоставить это с ответом API, используя ObjectMapper?

Например, я создал модель Opportunity:

import UIKit
import ObjectMapper

class Opportunity: NSObject, Mappable {

    var id: Int?
    var companyId: Int?
    var archived: Int?
    var createdBy: Int?
    var updatedBy: Int?
    var ownerId: Int?
    var accountId: Int?
    var name: String?
    var leadSource: String?
    var amount: String?
    var closeDate: String?
    var probability: String?
    var stage: String?
    var createdAt: String?
    var updatedAt: String?

    required init?(map: Map) {

    }

     func mapping(map: Map) {
        self.id <- map["id"]
        self.companyId <- map["company_id"]
        self.archived <- map["archived"]
        self.createdBy <- map["created_by"]
        self.updatedBy <- map["updated_by"]
        self.ownerId <- map["owner_id"]
        self.accountId <- map["account_id"]
        self.name <- map["name"]
        self.leadSource <- map["lead_source"]
        self.amount <- map["amount"]
        self.closeDate <- map["close_date"]
        self.probability <- map["probability"]
        self.stage <- map["stage"]
        self.createdAt <- map["created_at"]
        self.updatedAt <- map["updated_at"]
    }
}

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете создать базовую сущность и поместить туда общие поля.

Пример:

import UIKit
import ObjectMapper

class BaseEntity: NSObject, Mappable {

    var id: Int?
    var companyId: Int?
    var archived: Int?
    var createdBy: Int?
    var updatedBy: Int?
    var ownerId: Int?
    var name: String?
    var createdAt: String?
    var updatedAt: String?

    required init?(map: Map) {

    }

    func mapping(map: Map) {
        self.id <- map["id"]
        self.companyId <- map["company_id"]
        self.archived <- map["archived"]
        self.createdBy <- map["created_by"]
        self.updatedBy <- map["updated_by"]
        self.ownerId <- map["owner_id"]
        self.name <- map["name"]
        self.createdAt <- map["created_at"]
        self.updatedAt <- map["updated_at"]
    }

}

class Opportunity: BaseEntity {

    var accountId: Int?
    var leadSource: String?
    var amount: String?
    var closeDate: String?
    var probability: String?
    var stage: String?

    required init?(map: Map) {
        super.init(map: map)
    }

    override func mapping(map: Map) {
        super.mapping(map: map)
        self.accountId <- map["account_id"]
        self.leadSource <- map["lead_source"]
        self.amount <- map["amount"]
        self.closeDate <- map["close_date"]
        self.probability <- map["probability"]
        self.stage <- map["stage"]
    }

}

Примечание: BaseEntity не хорошее имя, я думаю, вы можете дать более подходящее имя.

...