【问题标题】:Contextual closure type Response<AnyObject> -> void expects 1 agrument but 3 were in closure body上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中
【发布时间】: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; 类型

标签: ios swift alamofire


【解决方案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:

    1. String(AF 扩展以符合其自己的URLConvertible 协议)的形式传入您的url,而不是作为NSURL。
    2. 切换URL的顺序和方法。 ...
    3. ...Swift 3 切换到小写枚举 (SE-006),因此该方法在 AF 4+ 中为小写。 ...
    4. ...当我们使用它时,.get 是默认方法,因此我们可以完全放弃它。
    5. URLResponseURLRequest 不再有 NS 前缀。
    6. 切换到新的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 中编译的,但我没有运行它(没有真正的端点),所以一粒粒的盐等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多