【问题标题】:AlamoFire with Swift 1.2: Ambiguous use of 'responseJSON'AlamoFire 与 Swift 1.2:“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)
            }

        }
    }
}

【问题讨论】:

  • 出于某种原因,分离尾随闭包可以解决问题。不知道为什么。有人吗?

标签: alamofire swift


【解决方案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)为我解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多