ios - 如何在 swift 的闭包中抛出错误?

标签 ios error-handling closures swift2

请看下面的代码:

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.sharedApplication().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
}

来自 Xcode 的错误消息是:从类型为“(UITableViewRowAction, NSIndexPath) throws -> Void”的抛出函数到非抛出函数类型“(UITableViewRowAction, NSIndexPath) -> Void”的无效转换

我知道问题是 managedObjectContext.save() 会抛出错误,这在完成处理程序中是不允许的。我发现一些博客文章在其中修改了闭包参数以使闭包中的错误处理可行。虽然这里函数的定义是由苹果给出的,但我该如何解决这个问题呢?非常感谢! :D

最佳答案

编译器正在将 throws 添加到您的 block 的签名中,因为您的 catch 子句并不详尽:模式匹配 let error as NSError可能会失败...请参阅 documentation

闭包参数的签名是 (UITableViewRowAction, NSIndexPath) -> Void,但是编译器推断你提供的闭包类型是 (UITableViewRowAction, NSIndexPath)抛出 -> Void

通过在您已经拥有的子句之后添加另一个 catch 子句(没有模式),编译器将看到您正在本地捕获异常并且它将不再推断您的闭包签名正在提供包括 throws:

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

关于ios - 如何在 swift 的闭包中抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31599615/

相关文章:

rust - 将切片从静态回调转发到 channel 时存在冲突的生命周期要求

javascript - 如何在 firebug 中跟踪或调试 javascript 闭包

iphone - ivar 在两个街区内

ios - 如何修复 "Argument passed to call that takes no arguments"错误?

ios - 如何创建 NSFetchedResultsController 将项目存储在节级别而不是行中?

python - 除非设置了调试标志,否则隐藏回溯

C# 如何在使用 getLastError 方法的全局错误处理程序中访问 DbEntityValidationException?

javascript - 使用变量源时无法将属性 'src' 设置为 null

objective-c - 需要 iOS 多重可达性

swift - 将反向地理编码的结果分配给全局变量