一尘不染

在appDelegate中进行Swift 2迁移saveContext()

swift

我刚刚下载了新的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()
        }
    }
}

关于如何使其运作的任何想法?


阅读 228

收藏
2020-07-07

共1个答案

一尘不染

您提供的两个错误中的第一个是令人误解的,但第二个是正确的。问题在于,!moc.save()从Swift
2开始,不再返回Bool,而是对其进行了注释throws。这意味着您必须使用try此方法及其catch可能发出的任何异常,而不仅仅是检查其返回值是true还是false。

为了反映这一点,在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()
        }
    }
}
2020-07-07