1

我正在尝试使用 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 函数中遇到错误“闭包元组参数'(HTTPURLResponse,Any)'不支持解构”。关于如何解决这个问题的任何想法?在此处输入图像描述

4

2 回答 2

3

您正在使用 map 方法,该方法具有以下方法签名。

/**
     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>

如您所见,转换闭包只应该将元素更改为您希望 Observable 成为的类型。Obsevable但是,在您的情况下,您似乎正在尝试返回<(HTTPURLResponse, Any)>ie。Observable<(HTTPURLResponse, Any)>从方法签名中可以看出,_request但是您返回Observable<Observable<(HTTPURLResponse, Any)>>,这就是您收到错误的原因。

看这个简单的例子,

let b = Observable.of(1, 2, 3, 4, 5).map { "\($0 + 1)" }

该示例转换元素并将每个元素加 1 并将其作为字符串返回。在这里,您正在转换每个元素。

此时的类型bObservable<String>

在你上面的例子中,你改变它的方式是你再次从地图返回 observable。

您的代码可以像这样可视化,

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)
    })

顺便说一句,最后的映射看起来是多余的,因为它只是返回输入,除非您打算将输入类型转换(response, json) 为其他类型。

于 2018-04-18T14:43:33.523 回答
1

闭包显然只有一个参数,它是两个值 (HTTPURLResponseAny) 的元组,但您编写的方式(response, json)告诉 swift 您正在尝试将单个元组参数解构为 2 个参数,这是不允许的。

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

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

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

.map { Observable.just($0) }
于 2018-04-18T09:28:34.587 回答