2

我已经开始将我的一个项目转换为 Swift 2 并且遇到了这个问题。下面开始这个块是完全有效的try/ catch,实际上它是由 Xcode 迁移工具生成的。

do {
       requestData = try NSJSONSerialization.dataWithJSONObject(requestContents, options: [])
} catch var error as NSError {
      requestError = error
      requestData = nil
}

如果我在闭包中使用相同的代码,例如 adataTaskWithRequest我会得到一个错误。错误在于任务分配,但它是导致它的问题。以下也有效,但我没有捕获错误。

let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, taskError) -> Void in
    if taskError != nil {
        NSLog("Error making request: " + taskError!.localizedDescription)
    } 
    else {
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
            if let parseJSON = json as NSDictionary? {
                // do some parsing here
            }
        } 
        catch {
           NSLog("Error in JSON serialization")
     }
  }
})
task.resume()

但是如果我尝试通过以下方式捕获错误:

} catch let e as NSError {

我收到此错误:

从 '(_, _, _) throws -> Void' 类型的抛出函数到非抛出函数类型 '(NSData?, NSURLResponse?, NSError?) -> Void' 的无效转换

我确实发现:

} catch _ {

有效,但对我有很多好处。

我错过了什么还是应该提交错误?

(这是 Xcode 7b5)

4

1 回答 1

3

的完成处理程序dataTaskWithRequest并非旨在抛出类似JSONObjectWithData的错误NSJSONSerialization,其签名是:

class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject

执行以下操作会起作用(与您尝试过的相同):

catch _

但这不会为我们提供有关抛出错误的任何详细信息,即 from class func JSONObjectWithData

因此,我们需要一种方法来消耗不可投掷物,同dataTaskWithRequest​​时保留可投掷物 - JSONObjectWithData

我尝试了以下方法:

catch let error as NSError
{
     //error specific to JSON serialization
     NSLog("Error in JSON serialization \(error)")
}
catch
{
     //exhaust the error
     NSLog("Some error")
}
于 2015-08-21T04:19:08.903 回答