¿Cómo lanzar errores en un cierre rápido?

Mire el siguiente código:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler: { (action : UITableViewRowAction, indexPath : NSIndexPath) -> Void in if let managedObjectContext = (UIApplication.shanetworkingApplication().delegate as! AppDelegate).managedObjectContext{ let restaurantToDelete = self.fetchResultController.objectAtIndexPath(indexPath) as! Restaurant managedObjectContext.deleteObject(restaurantToDelete) // Saving managedObjectContext instance, and catch errors if it fails do { try managedObjectContext.save() } catch let error as NSError { print("Error: \(error.localizedDescription)") } } }) return deleteAction } 

el post de error de Xcode es: Conversión no válida desde la function de lanzamiento del tipo '(UITableViewRowAction, NSIndexPath) lanza -> Void' al tipo de function no lanzable '(UITableViewRowAction, NSIndexPath) -> Void'

Sé que el problema es managedObjectContext.save () arrojará errores y esto no está permitido en el manejador de finalización. Encontré algunos artículos de blog en los que modificaron los parameters de cierre para que el event handling errores en un cierre sea factible. Si bien aquí Apple da la definición de la function, ¿cómo puedo solucionar este problema? ¡Muchas gracias! :RE

el comstackdor agrega throws a la firma de su bloque porque su cláusula de catch no es exhaustiva: la coincidencia de patrón let error as NSError pueda fallar … consulte la documentation

la firma del argumento de cierre es (UITableViewRowAction, NSIndexPath) -> Void , sin embargo, el comstackdor infiere el tipo de cierre que está proporcionando (UITableViewRowAction, NSIndexPath) throws -> Void

agregando otra cláusula de catch (sin patrón) después de la que ya tiene el comstackdor verá que está capturando la exception localmente y ya no inferirá que la firma del cierre que está proporcionando incluye los throws :

 do { try managedObjectContext.save() } catch let error as NSError { print("Error: \(error.localizedDescription)") } catch {} 

No es posible, porque el cierre se puede invocar en cualquier momento, probablemente no en el momento de ejecución de su function, así que ¿a dónde debería propagarse el error?

Tienes que llamar a otra function que pueda manejar el error:

 func handleError(error: ErrorType) { switch error { ... } } 

y luego llame a esta function con su error atrapado dentro del cierre