Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 2 migration saveContext() in appDelegate

Tags:

I have just downloaded the new Xcode 7.0 beta and did a migration from Swift 1.2 to Swift 2. The migration apparently did not change the whole code, in fact a method saveContext() which was fine until throws 2 errors for the line:

if moc.hasChanges && !moc.save() { 

Binary operator '&&' cannot be applied to two Bool operands

and

Call can throw, but it is not marked with 'try' and the error is not handled

The method looks like this:

// 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()         }     } } 

Any ideas on how to get it working?

like image 479
kalafun Avatar asked Jun 09 '15 10:06

kalafun


1 Answers

The first of the two errors you provided is misleading, but the second is spot on. The problem is in !moc.save() which as of Swift 2, no longer returns Bool and is instead annotated throws. This means that you you have to try this method and catch any exceptions that it may emit, instead of just checking wether its return value is true or false.

To reflect this, a new project created in Xcode 7 using Core Data will produce the following boilerplate code which can replace the code you're using.

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()         }     } } 
like image 185
Mick MacCallum Avatar answered Oct 06 '22 18:10

Mick MacCallum