在Swift中使用AlamoFire创建通用方法

编程入门 行业动态 更新时间:2024-10-25 19:37:46
本文介绍了在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/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 }

(参见 stackoverflow/a/37949671/406322 关于我如何提出上述代码。)

(see stackoverflow/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, "myserver/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创建通用方法

本文发布于:2023-11-26 01:57:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1632189.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:方法   Swift   AlamoFire

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!