结构返回Void在Alamofire responseJSON中的理解

时间:2016-09-06 03:07:23

标签: swift alamofire

我正忙着研究为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函数。

有人可以帮我解决这个问题。

2 个答案:

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