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 在参数中发布文件?