闭包元组参数错误

Posted

技术标签:

【中文标题】闭包元组参数错误【英文标题】:Error in closure tuple parameter 【发布时间】:2018-04-18 09:10:24 【问题描述】:

我正在尝试使用 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)' 不支持解构”。关于如何解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

您正在使用 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&lt;(HTTPURLResponse, Any)&gt; 即。 Observable&lt;(HTTPURLResponse, Any)&gt; 可以从 _request 方法签名中看出,但您返回 Observable&lt;Observable&lt;(HTTPURLResponse, Any)&gt;&gt;,这就是您收到错误的原因。

看看这个简单的例子,

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

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

此时b的类型为Observable&lt;String&gt;

在您上面的示例中,您将其更改为再次从地图返回 observable。

你的代码可以这样可视化,

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

现在,b 不是Observable&lt;String&gt;,而是Observable&lt;Observable&lt;String&gt;&gt;

这正是您的代码存在的问题。

这是您的_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&lt;(HTTPURLResponse, Any)&gt;

但是你做了一些魔法然后返回,

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) 转换为其他类型。

【讨论】:

【参考方案2】:

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

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

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

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

.map  Observable.just($0) 

【讨论】:

我在返回 Observable.just(tuple.0, tuple.1) "Missing argument label 'scheduler:' in call" 时出错 @VinodRadhakrishnan 实际上,您想用Observable 做什么?您是否只想创建一个只有一个值的Observable?将 2 个任意参数传递给 Observable.just 是没有意义的。请参阅编辑后的答案。也许这就是你的意思? 我的要求是返回httpResponse和json数据。我是 RxSwift 的初学者,所以不知道我的做法是否正确。 @VinodRadhakrishnan 从周围函数的返回类型来看,我的回答似乎可行。我建议你先了解更多关于 RxSwift 的知识。

以上是关于闭包元组参数错误的主要内容,如果未能解决你的问题,请参考以下文章

转义闭包捕获 Swift 中的变异“self”参数错误

Swift 3.0 错误:转义闭包只能按值显式捕获 inout 参数

包含闭包参数的方法期望类型错误?

具有多个闭包参数的函数给出错误“表达式解析为未使用的函数”

错误:将非转义参数'publicationQuery'分配给@escaping闭包

SML中来自元组的“Curry”