Swift 2 попробовать/поймать

Я начал преобразовывать один из своих проектов в Swift 2 и столкнулся с этой проблемой. Для начала этого блока ниже вполне допустимы try/catch, на самом деле он был сгенерирован инструментом миграции Xcode.

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

Если я использую тот же код внутри замыкания, например dataTaskWithRequest, я получаю сообщение об ошибке. Ошибка заключается в назначении задачи, но ее причина заключается в уловке. Следующее также работает, но я не фиксирую ошибку.

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)


person rjb101    schedule 20.08.2015    source источник


Ответы (1)


Обработчик завершения dataTaskWithRequest не предназначен для выдачи ошибки, такой как JSONObjectWithData для NSJSONSerialization, сигнатура которой:

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

Выполнение следующего будет работать (так же, как вы пробовали):

catch _

Но это не даст нам подробностей об ошибке от той, что выкидывает, а именно от 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")
}
person Unheilig    schedule 21.08.2015
comment
идеально. Я бы не подумал об этом, если бы не выдавал пользовательский ErrorType. Спасибо !! - person rjb101; 21.08.2015