请看下面的代码:
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
到你的区块的签名,因为你的catch
子句并不详尽:模式匹配let error as NSError
可能会失败...请参阅文档
闭包参数的签名是(UITableViewRowAction, NSIndexPath) -> Void
,但是编译器正在推断您提供的闭包的类型(UITableViewRowAction, NSIndexPath) throws -> Void
通过添加另一个catch
子句(没有模式)在您已经拥有的子句之后,编译器将看到您正在本地捕获异常,并且它将不再推断您提供的闭包的签名包括throws
:
do {
try managedObjectContext.save()
} catch let error as NSError {
print("Error: \(error.localizedDescription)")
} catch {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)