Универсальная функция для сопоставления объектов JSON с ObjectMapper

#swift #generics #swift2 #alamofire #objectmapper

#swift #универсальные #swift2 #alamofire #objectmapper

Вопрос:

У меня есть универсальная функция:

    func toObjectMapper<T: Mappable>(mapper: T, success: (result: Mappable) -> Void, failure: (error: NSError) -> Void){
        let alomofireApiRequest = AlamofireApiRequest(apiRequest: self)
        Alamofire.request(alomofireApiRequest)
            .responseObject { (response: Response<T, NSError>) in
                guard let value = response.result.value else {
                    failure(error: response.result.error!)
                    return
                }
                success(result: value)
        }

    }
  

И я хочу назвать это так:

 public func login(login: String, password: String) -> UserResponse {
        let params = ["email":login, "password":password]

        let request = ApiRequest(method: .POST, path: "login", parameters: params)

        request.toObjectMapper(UserResponse.self, success: { result in
                print(result)

            }, failure: { error in
                print(error.description)
        })
    }
  

Но я всегда получаю эту ошибку:

  Cannot invoke 'toObjectMapper' with an argument list of type '(UserResponse.Type, success: (result: Mappable) -> Void, failure: (error: NSError) -> Void)'
  

Это мой пользовательский ответ:

 import Foundation
import ObjectMapper
import RealmSwift

public class  UserResponse: Object, Mappable {
    dynamic var id = 0
    dynamic var name = ""
    dynamic var address = ""
    dynamic var zipcode = ""
    dynamic var city = ""
    dynamic var country = ""
    dynamic var vat = ""
    dynamic var email = ""
    dynamic var created_at = NSDate()
    dynamic var updated_at = NSDate()

    override public static func primaryKey() -> String? {
        return "id"
    }

    //Impl. of Mappable protocol
    required convenience public init?(_ map: Map) {
        self.init()
    }

    public func mapping(map: Map) {
        id    <- map["id"]
        name <- map["name"]
        address <- map["address"]
        zipcode <- map["zipcode"]
        city <- map["city"]
        country <- map["country"]
        vat <- map["vat"]
        email <- map["email"]
        created_at <- map["created_at"]
        updated_at <- map["updated_at"]


    }
}
  

Любая помощь?

Ответ №1:

Я думаю, проблема в том, что вы пытаетесь использовать UserResponse в качестве экземпляра объекта, но используете UserResponse.self — это только тип класса.

Решение состоит в том, чтобы заставить UserResonse использовать одноэлементный элемент (или просто создать экземпляр экземпляра перед передачей его в ‘toObjectMapper’ в качестве аргумента)

Я не знаю, будет ли работать этот код, но он соответствует этим строкам:-

 public class  UserResponse: Object, Mappable {
dynamic var id = 0
dynamic var name = ""
dynamic var address = ""
dynamic var zipcode = ""
dynamic var city = ""
dynamic var country = ""
dynamic var vat = ""
dynamic var email = ""
dynamic var created_at = NSDate()
dynamic var updated_at = NSDate()

static let shared = UserResponse() //singleton instantiation

override public static func primaryKey() -> String? {
    return "id"
}

//Impl. of Mappable protocol
required convenience public init?(_ map: Map) {
    self.init()
}

public func mapping(map: Map) {
    id    <- map["id"]
    name <- map["name"]
    address <- map["address"]
    zipcode <- map["zipcode"]
    city <- map["city"]
    country <- map["country"]
    vat <- map["vat"]
    email <- map["email"]
    created_at <- map["created_at"]
    updated_at <- map["updated_at"]


}
}
  

а затем в вызове вашей функции

 public func login(login: String, password: String) -> UserResponse {
    let params = ["email":login, "password":password]

    let request = ApiRequest(method: .POST, path: "login", parameters: params)

    request.toObjectMapper(UserResponse.shared, success: { result in
            print(result)

        }, failure: { error in
            print(error.description)
    })
}
  

Комментарии:

1. Я провел быстрый тест, и он отключил предупреждение. Итак, вам нужно создать экземпляр UserResponse . Выше приведен лишь приблизительный пример того, как я бы это сделал.