我正忙着研究为Swift创建的Alamofire网络库。我遇到了responseJSON函数:
public func responseJSON(
queue queue: dispatch_queue_t? = nil,
options: NSJSONReadingOptions = .AllowFragments,
completionHandler: Response<AnyObject, NSError> -> Void)
-> Self
{
return response(
queue: queue,
responseSerializer: Request.JSONResponseSerializer(options: options),
completionHandler: completionHandler
)
}
我的问题很简单,Response<AnyObject, NSError> -> Void
是什么意思?这一行是否意味着responseJSON
方法的完成处理程序采用类型为Response<AnyObject, NSError> -> Void
的函数类型?如果是这种情况应该是(Response<AnyObject, NSError>) -> Void
?
我是swift的新手,从Swift语法开始,它让我相信Response
结构本身正在返回Void,而Response<AnyObject, NSError> -> Void
不是函数类型,而只是一个Void函数。
有人可以帮我解决这个问题。
答案 0 :(得分:0)
它是一个带有函数类型Response的闭包,它不会返回任何内容。
由于它是一个完成处理程序,您应该传递一个负责处理响应的函数。
可以是
.responseJSON({ response in
//your logic
})
答案 1 :(得分:0)
我正在冒昧地详细说明霍斯特的答案,因为你是斯威夫特的新手。闭包是一段代码(实际上就像一个函数),它将在代码中的某个点执行。因此,当您编写Alamofire.request(###).responseJSON(completionHandler: yourHandler)
时,您告诉Alamofire发出请求,并且一旦从服务器获得响应,您也会给它执行代码(因为调用是异步的)。在Alamofire代码的某个地方,当请求完成后,它会调用您提供的completionHandler(response)
关闭,response
参数类型为Response<AnyObject, NSError>
。
Response<AnyObject, NSError> -> Void
签名意味着你的闭包有一个你可以在你的闭包代码中使用的参数。这意味着Alamofire将为您提供响应对象,您可以在闭包的代码中使用它。在Swift中编写闭包的简短而优雅的方法类似于Horst所写的:
Alamofire.request(###).responseJSON {response in
// Your code
switch response {
case .Success(let json):
// Use the json
case .Failure(let error):
// Use the error
}
}