【问题标题】:Generic function to map JSON objects with ObjectMapper使用 ObjectMapper 映射 JSON 对象的通用函数
【发布时间】:2016-10-01 08:13:01
【问题描述】:

我有一个通用函数:

   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"]


    }
}

有什么帮助吗?

【问题讨论】:

    标签: swift generics swift2 alamofire objectmapper


    【解决方案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)
        })
    }
    

    【讨论】:

    • 我做了一个快速测试,它消除了警告。所以你需要实例化一个 UserResponse 的实例。以上只是我将如何做的一个粗略示例。
    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2019-08-03
    • 2017-09-02
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多