AlamoFire 与 Swift 1.2:“responseJSON”的模糊使用

Posted

技术标签:

【中文标题】AlamoFire 与 Swift 1.2:“responseJSON”的模糊使用【英文标题】:AlamoFire with Swift 1.2: Ambiguous use of 'responseJSON' 【发布时间】:2015-02-16 13:31:14 【问题描述】:

我正在尝试在 XCode 6.3 中将 AlamoFire 与 Swift 1.2 一起使用。我已经解决了大部分问题(即更改为 as!)但我有一个我无法弄清楚。

以下代码(以及类似的 sn-ps)会在第 5 行(“req.responseJSON()”)生成编译时错误,并显示消息“模糊使用 'responseJSON'”。我需要在 AlamoFire 库或我的代码中更改什么来修复它?注意:我按照文档中的说明导入了项目,它在 Swift 1.1 和 XCode 6.1.1 中运行良好

func theaters(delegate:GlobalNetworkingDelegate)
    if let url = self.mainNetworkingUrl
        var urlToUse = url + "theaters"
        var req:Request = Alamofire.request(.GET, urlToUse, parameters: [:], encoding: .URL)
            req.responseJSON()
            (req, response, jsonOut, error) in

            if(response.statusCode == 200 && error == nil)
                var ajson = JSON(jsonOut!)
                delegate.globalTheatersOutomce!(true, json: jsonOut, error: error)
            

        
    

【问题讨论】:

出于某种原因,分离尾随闭包可以解决问题。不知道为什么。有人吗? 【参考方案1】:

我还得到了以下工作:

    Alamofire.manager.request(.PUT, pathWithId(user.key), parameters: user.toDict(), encoding: .JSON)
    .responseString( completionHandler: 
        (request: NSURLRequest, response: NSHTTPURLResponse?, responseBody: String?, error: NSError?) -> Void in
            if responseBody == "OK" 
                completion(user, nil)
             else 
                completion(nil, error)
            
    )

即通过显式声明闭包的参数名称,而不是让它跟在方法括号后面。看来新编译器在识别方法方面有问题。

【讨论】:

【参考方案2】:

将尾随闭包分离到它自己的变量中,然后调用 resonseJSON(closure) 解决了这个问题,但我不知道为什么。有人有理由吗?这是工作代码:

func theaters(delegate:GlobalNetworkingDelegate)
    if let url = self.mainNetworkingUrl
        var urlToUse = url + "theaters"

        var req:Request = Alamofire.request(.GET, urlToUse, parameters: [:], encoding: .URL)

        var aClosure = (req:NSURLRequest, response:NSHTTPURLResponse?, jsonOut:AnyObject?, error:NSError?) -> Void in

            if(response!.statusCode == 200 && error == nil)
                var ajson = JSON(jsonOut!)
                delegate.globalTheatersOutomce!(true, json: jsonOut, error: error)
            

        

        req.responseJSON(aClosure)


        

【讨论】:

【参考方案3】:

如果您将闭包包装在 () 中而不是将其放在尾随它也可以工作。它的工作原理与此处的其他答案相同,只是另一种编写方式。

func theaters(delegate:GlobalNetworkingDelegate)
if let url = self.mainNetworkingUrl 
    var urlToUse = url + "theaters"
    var req:Request = Alamofire.request(.GET, urlToUse, parameters: [:], encoding: .URL)
        req.responseJSON(
        (req, response, jsonOut, error) in

        if(response.statusCode == 200 && error == nil)
            var ajson = JSON(jsonOut!)
            delegate.globalTheatersOutomce!(true, json: jsonOut, error: error)
        

    )
  

【讨论】:

用 Alamofire 解决了我同样的问题,很奇怪......有什么合乎逻辑的解释吗?【参考方案4】:

我遇到了同样的问题。将您的 Alamofire 更新到最新版本(我写答案时为 1.2.2)为我解决了这个问题。

【讨论】:

以上是关于AlamoFire 与 Swift 1.2:“responseJSON”的模糊使用的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 失败:Alamofire 中的 responseValidationFailed(状态码 401)

Swift 中 AlamoFire 的 Youtube API

JSON:使用 Alamofire 和 Swift 3 提取数据

Swift 4:如何使用 Alamofire 在参数中发布文件?

Alamofire 2.0 和 Swift 2 - 标头不工作。看看如何修复它

无法从 Alamofire 的 Swift 3 中的 Web 服务的 PATCH API 调用中获得响应