闭包元组参数错误
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
的 <(HTTPURLResponse, Any)>
即。 Observable<(HTTPURLResponse, Any)>
可以从 _request
方法签名中看出,但您返回 Observable<Observable<(HTTPURLResponse, Any)>>
,这就是您收到错误的原因。
看看这个简单的例子,
let b = Observable.of(1, 2, 3, 4, 5).map "\($0 + 1)"
该示例转换元素并将每个元素加 1 并将其作为字符串返回。在这里,您正在转换每个元素。
此时b
的类型为Observable<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)
转换为其他类型。
【讨论】:
【参考方案2】:闭包显然只有一个参数,它是两个值的元组(HTTPURLResponse
和 Any
),但是您编写 (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 3.0 错误:转义闭包只能按值显式捕获 inout 参数