关闭元组参数出错

时间:2018-04-18 09:10:25

标签: ios swift alamofire rx-swift rxalamofire

我尝试使用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;。关于如何解决这个问题的任何想法?enter image description here

2 个答案:

答案 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)

闭包显然只有一个参数,它是两个值(constexprHTTPURLResponse)的元组,但你写Any的方式告诉swift你正试图解构单个元组参数分为2个参数,这是不允许的。

你必须把它写成一个参数:

(response, json)

如果可以推断出类型,你也可以这样写:

.map({ tuple -> Observable<(HTTPURLResponse, Any)> in
    return Observable.just(tuple)
})