我刚刚下载了新的Xcode 7.0 beta,并完成了从Swift 1.2到Swift 2的迁移。迁移显然并没有改变整个代码,实际上,方法saveContext()很好,直到抛出2条错误为止:
if moc.hasChanges && !moc.save() {
二进制运算符“ &&”不能应用于两个布尔操作数
和
可以抛出呼叫,但未将其标记为“ try”,并且未处理错误
该方法如下所示:
// MARK: - Core Data Saving support func saveContext () { if let moc = self.managedObjectContext { var error: NSError? = nil if moc.hasChanges && !moc.save() { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog("Unresolved error \(error), \(error!.userInfo)") abort() } } }
关于如何使其运作的任何想法?
您提供的两个错误中的第一个是令人误解的,但第二个是正确的。问题在于,!moc.save()从Swift 2开始,不再返回Bool,而是对其进行了注释throws。这意味着您必须使用try此方法及其catch可能发出的任何异常,而不仅仅是检查其返回值是true还是false。
!moc.save()
throws
try
catch
为了反映这一点,在Xcode 7中使用Core Data创建的新项目将产生以下样板代码,这些样板代码可以替换您正在使用的代码。
func saveContext () { if managedObjectContext.hasChanges { do { try managedObjectContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nserror = error as NSError NSLog("Unresolved error \(nserror), \(nserror.userInfo)") abort() } } }