在Swift中使用AlamoFire创建通用方法 [英] Creating a generic method with AlamoFire in Swift

查看:94
本文介绍了在Swift中使用AlamoFire创建通用方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用AlamoFire进行API调用,并在我的项目中使用类似的东西:

I am using AlamoFire for my API calls, and have something like this all over my project:

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 关于我如何提出上述代码。)

(see https://stackoverflow.com/a/37949671/406322 on how I came up with the above code).

问题是我有很多除User以外的对象,并且代码重复只有对象的类型不同,所以我试图创建一个泛型方法,类似于这个:

The problem is that I have a lot of objects other than User and there is code repetition with only the type of the object different, so I'm trying to create a generic method, something like this:

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 
 }

但Swift抱怨:

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
            }

我做得不对?

推荐答案

您可以使用BaseObject轻松完成此任务:

you can use a BaseObject to do this easy :

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 可以保存句柄,使用baseobj你不需要使用协议一次又一次地写它们

class can hold the handle ,and with the baseobj you don't need to write them again and again by using protocol

这篇关于在Swift中使用AlamoFire创建通用方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆