我尝试使用RxSwift和RxAlamofire编写API层。 以下是API请求的代码。
public func _request(_ method: Alamofire.HTTPMethod, url: URLConvertible, parameters: [String : Any]? , encoding: ParameterEncoding, headers: [String : String]?, isSecondTryAfterAuth: Bool = false) -> RxSwift.Observable<(HTTPURLResponse, Any)>
{
return RxAlamofire
.requestJSON(method, url, parameters: parameters, encoding: JSONEncoding.default, headers: self.appDelegateInstance.refreshToken)
.map({ (response, json) -> Observable<(HTTPURLResponse, Any)> in
return Observable.just(response, json)
})
}
我在.map函数中遇到错误&#34;关闭元组参数&#39;(HTTPURLResponse,Any)&#39;不支持解构&#34;。关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
您正在使用map方法,该方法具有以下方法签名。
$(document).on('click', 'button.number', function () {
alert($(this).val());
$.ajax({
method: 'GET',
url: '@Url.Action("About", "Home")'
}).success: function(result){
///this line
window.href='redirect url';
}});;
});
正如您所看到的,转换闭包只能将元素更改为您希望Observable成为的类型。但是,在您的情况下,您似乎正在尝试返回/**
Projects each element of an observable sequence into a new form.
- seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
- parameter transform: A transform function to apply to each source element.
- returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
*/
public func map<R>(_ transform: @escaping (Self.E) throws -> R) -> RxSwift.Observable<R>
Obsevable
即{。}}。 <(HTTPURLResponse, Any)>
可以从Observable<(HTTPURLResponse, Any)>
方法签名中看到,但您返回_request
,这就是您收到错误的原因。
看看这个简单的例子,
Observable<Observable<(HTTPURLResponse, Any)>>
该示例转换元素并将1添加到每个元素并将其作为字符串返回。这里,您要转换每个元素。
此时let b = Observable.of(1, 2, 3, 4, 5).map { "\($0 + 1)" }
的类型为b
在上面的示例中,您可以通过再次从地图返回observable的方式对其进行更改。
您的代码可以这样显示,
Observable<String>
现在,let b = Observable.of(1, 2, 3, 4, 5).map { Observable.just("\($0 + 1)) }
不是b
,而是Observable<String>
。
这正是你的代码所带来的问题。
这是您的Observable<Observable<String>>
方法,
_request
预期的回报类型是public func _request(_ method: Alamofire.HTTPMethod, url: URLConvertible, parameters: [String : Any]? , encoding: ParameterEncoding, headers: [String : String]?, isSecondTryAfterAuth: Bool = false) -> RxSwift.Observable<(HTTPURLResponse, Any)>
但你做了一些魔法并返回,
Observable<(HTTPURLResponse, Any)>
根据你的方法的返回类型,我希望这是你想要做的,
Observable<Observable<(HTTPURLResponse, Any)>>
顺便说一下,最后的地图看起来是多余的,因为它只是返回输入,除非你打算将输入类型return RxAlamofire
.requestJSON(method, url,
parameters: parameters,
encoding: JSONEncoding.default,
headers: self.appDelegateInstance.refreshToken)
.map( { (response, json) -> (HTTPURLResponse, Any) in
return (response, json)
})
转换为其他类型。
答案 1 :(得分:1)
闭包显然只有一个参数,它是两个值(constexpr
和HTTPURLResponse
)的元组,但你写Any
的方式告诉swift你正试图解构单个元组参数分为2个参数,这是不允许的。
你必须把它写成一个参数:
(response, json)
如果可以推断出类型,你也可以这样写:
.map({ tuple -> Observable<(HTTPURLResponse, Any)> in
return Observable.just(tuple)
})