gpt4 book ai didi

ios - 在 Swift 中使用 AlamoFire 创建泛型方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:31:53 25 4
gpt4 key购买 nike

我正在使用 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,了解我是如何得出上述代码的)。

问题是我有很多对象而不是 User 并且代码重复只是对象的类型不同,所以我正在尝试创建一个通用方法,如下所示:

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 来轻松完成此操作:

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)写一遍了

关于ios - 在 Swift 中使用 AlamoFire 创建泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37995945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com