Swift 1.2 到 Swift 2:无法将类型的值转换为预期的参数类型

Posted

技术标签:

【中文标题】Swift 1.2 到 Swift 2:无法将类型的值转换为预期的参数类型【英文标题】:Swift 1.2 to swift 2: Cannot convert value of type to expected argument type 【发布时间】:2016-05-04 05:22:55 【问题描述】:

我正在尝试根据我在网上找到的教程 (https://www.raywenderlich.com/85528/user-accounts-ios-ruby-rails-swift#next_section) 创建一个 NSURLSession 任务,我收到以下错误:

无法将类型 '(NSData!, NSURLResponse!, NSError!) -> ()' 的值转换为预期的参数类型 '(NSData?, NSURLResponse?, NSError?) -> Void

在这段代码中:

let task = session.dataTaskWithRequest(request)  (data: NSData!, response: NSURLResponse!, error: NSError!) in

问题所在的函数可以在这里找到

func sendRequest(request: NSURLRequest, completion:(NSData!, NSError!) -> Void) -> () 
// Create a NSURLSession task
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request)  (data: NSData!, response: NSURLResponse!, error: NSError!) in
  if error != nil 
    dispatch_async(dispatch_get_main_queue(),  () -> Void in
      completion(data, error)
    )

    return
  

  dispatch_async(dispatch_get_main_queue(),  () -> Void in
    if let httpResponse = response as? NSHTTPURLResponse 
      if httpResponse.statusCode == 200 
        completion(data, nil)
       else 
        var jsonerror:NSError?
        if let errorDict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error:&jsonerror) as? NSDictionary 
          let responseError : NSError = NSError(domain: "HTTPHelperError", code: httpResponse.statusCode, userInfo: errorDict as? [NSObject : AnyObject])
          completion(data, responseError)
        
      
    
  )

完整的代码块可在此处 (https://codeshare.io/uJPcX) 第 68 行找到。

【问题讨论】:

尝试将data: NSData!, response: NSURLResponse!, error: NSError!更改为data: NSData?, response: NSURLResponse?, error: NSError? 成功了!谢谢@Fonix 没问题 :),您应该查看可选变量的工作原理以完全理解 !和 ?很快,以后使用这些参数中的任何一个都可能需要!在他们之后(以及一些空检查) 【参考方案1】:

改变

data:NSData!, response: NSURLResponse!, error: NSError!

data: NSData?, response: NSURLResponse?, error: NSError?

当使用dataresponse 等时,你可能必须写成data! 来解开变量,但要小心,因为如果变量是nil,它会崩溃,所以你必须检查首先不是零

【讨论】:

以上是关于Swift 1.2 到 Swift 2:无法将类型的值转换为预期的参数类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 1.2 获得 supportInterfaceOrientationsForWindow

SwiftyJSON 不工作 / Swift 1.2 SwiftyJSON 文件

Swift 2 到 Swift 3:无法将类型 '(Data?, NSError?) -> Void' 的值转换为预期的参数类型 'GTMSessionFetcherCompletionHand

Swift 1.2 不能使用类型为 '(String)' 的参数列表调用 'count'

如何将 TestFlight 与 Swift 1.2 应用程序一起使用?

在 Swift 1.2 中使用assetForURL