【问题标题】:Creating a generic method with AlamoFire in Swift在 Swift 中使用 AlamoFire 创建泛型方法
【发布时间】:2016-10-26 01:02:07
【问题描述】:

我正在使用 AlamoFire 进行 API 调用,并且在我的项目中到处都是这样的:

static func login(userName: String, password: String) -> User {
    let parameters = ["userName": userName , "password": password]
    let user = User()
    Alamofire.request(.POST, "myserver.com/login", parameters: parameters, encoding: .JSON)
        .validate()
        .responseObject { (response: Response<User, NSError>) in
            switch response.result {
            case .Success(let value):
                user.valueHandle?(value)
            case .Failure(let error):
                user.errorHandle?(error)
            }
    }

    return user
}

(请参阅https://stackoverflow.com/a/37949671/406322,了解我是如何提出上述代码的)。

问题是我有很多除用户之外的对象,并且代码重复只是对象的类型不同,所以我试图创建一个通用方法,如下所示:

static func sendRequest<T>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T {
        let response : T
        Alamofire.request(method, urlString, parameters:parameters)
            .validate()
            .responseObject { (response: Response<T, NSError>) in
                switch response.result {
                case .Success(let value):
                    response.valueHandle?(value)
                case .Failure(let error):
                    response.errorHandle?(error)
                }
        }

        return response 
 }

但斯威夫特在抱怨:

Cannot convert value of type '(Response<T, NSError>) -> ()' to expected argument type 'Response<_, NSError> -> Void'

这样我就可以做这样的事情了:

User.swift
static func login(userName: String, password: String) -> User {
        let parameters = ["userName": userName, "password": password]
    return sendRequest<User>(.GET, "http://myserver.com/users", parameters)
}

在我的调用代码中:

User.login(txtUserName.text!, password: txtPassword.text!)
            .success { (value) in
                var user = value as! User
                //do something with user
            }
            .error { (error) in
                //show error
            }

我做错了什么?

【问题讨论】:

  • @AMomchilov 是的,但我在这里所做的是将其包装更高一级,因此响应处理程序被发送回我的调用代码(如 javascript 承诺)。
  • @AMomchilov 我编辑了我的问题以澄清

标签: ios swift swift2 alamofire


【解决方案1】:

您可以使用 BaseObject 轻松做到这一点:

class BaseUser: ResponseObjectSerializable {
    var valueHandle : ((BaseUser)->())?
    var errorHandle : ((NSError)->())?

    required init?(response: NSHTTPURLResponse, representation: AnyObject) {

    }
}



func sendRequest<T:BaseUser>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T {
    let res : T
    Alamofire.request(method, urlString, parameters:parameters)
        .validate()
        .responseObject { (response: Response<T, NSError>) in
            switch response.result {
            case .Success(let value):
                res.valueHandle?(value)
            case .Failure(let error):
                res.errorHandle?(error)
            }
    }

    return res
}

class可以握住handle,有了baseobj就不用再用protocol写一遍了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多