上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中

Posted

技术标签:

【中文标题】上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中【英文标题】:Contextual closure type Response<AnyObject> -> void expects 1 agrument but 3 were in closure body 【发布时间】:2016-09-12 08:05:07 【问题描述】:

这段代码在 ios 8 和 swift 2.0 上完全可以运行我之前的项目。

这是我的代码:

let url=NSURL(string: _resourceURL)!

Alamofire.request(.GET ,url).responseJSON  (request : NSURLRequest?,response: NSHTTPURLResponse?, result: Result<AnyObject> ) -> void in
   print(result.value.debugDescription)

现在我尝试使用 iOS 9、Swift 3.0、alamofire 4.0.0 但抛出以下错误:

泛型类型“结果”专用于太少的类型参数(得到 1,但预期为 2) 使用未声明的类型“void” 上下文闭包类型 'Response -> Void' 需要 1 个参数,但在闭包主体中使用了 3 个

【问题讨论】:

Result&lt;AnyObject, NSError&gt; @ozgur 这将修复泛型类型错误但是,应该只有一个参数,并且应该是 Response&lt;AnyObject, NSError&gt; 类型 【参考方案1】:

如果您没有需要将 JSON 转换为的特定对象,并且您乐于通过键访问属性,则可以这样做:

Alamofire.request(.GET, url).responseJSON  response in
    if let JSON = response.result.value 
        print("JSON: \(JSON)")
    

【讨论】:

【参考方案2】:

Alamofire 的乐于助人的精灵写了一个简洁但不可或缺的migration guide,包括“之前/之后”风格的代码 sn-ps。基于这些,您需要对代码执行一些操作才能使用 AF 4.0:

    String(AF 扩展以符合其自己的URLConvertible 协议)的形式传入您的url,而不是作为NSURL。 切换URL的顺序和方法。 ... ...Swift 3 切换到小写枚举 (SE-006),因此该方法在 AF 4+ 中为小写。 ... ...当我们使用它时,.get 是默认方法,因此我们可以完全放弃它。 URLResponseURLRequest 不再有 NS 前缀。 切换到新的DataResponse 类型,其中包含我们的朋友resultrequestresponse

所以工作代码可能如下所示:

    // resourceURL
let url = "http://www.example.com/endpoint"

Alamofire.request(url).responseJSON  dataResponse in
  guard 
    let request = dataResponse.request,
    let response = dataResponse.response
    else  fatalError("Don't ship me, debug me, master!") 

    print(dataResponse.result.value.debugDescription)

这是在 XCode 8GM 中编译的,但我没有运行它(没有真正的端点),所以一粒粒的盐等等。

【讨论】:

以上是关于上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中的主要内容,如果未能解决你的问题,请参考以下文章

根据闭包上下文的要求,返回类型“future<bool>”不是“Future<bool>”

上下文闭包类型 '(Data?, URLResponse?, Error?) -> Void' 需要 3 个参数,但 1 在闭包主体中使用

无法在当前上下文中推断闭包类型

如何修复上下文闭包类型 '((String, JSON), (String, JSON)) -> Bool' 需要 2 个参数,但在闭包体中使用了 1 个?

根据闭包上下文的要求,返回类型“动态”不是“布尔”

FutureBuilder 错误:返回类型“对象?”不是闭包上下文所要求的“小部件”