Swift:更新并收到错误:"无法调用'!='使用类型的参数列表。"

时间:2014-09-20 18:01:14

标签: swift xcode6

在Xcode beta 5中一切都很好但是现在在完全成熟的Xcode中我在我的App Delegate中遇到了2个类似的错误:

  1. "cannot invoke '!=' with argument list of type '(NSManagedObjectContext, NilLiteralConvertible')"

  2. "cannot invoke '!=' with argument list of type '(NSPersistentStoreCoordinator, NilLiteralConvertible')"

  3. 我尝试用!==替换!=,我得到了一个不同的错误。我不知道问题是什么!=。 代码:

    func saveContext () {
            var error: NSError? = nil
            let managedObjectContext = self.managedObjectContext
            if managedObjectContext != nil { //THIS LINE
                if managedObjectContext.hasChanges && !managedObjectContext.save(&error) {
                    // Replace this implementation with code to handle the error appropriately.
                    // abort() causes the application to generate a crash log and terminate.
                    //println("Unresolved error \(error), \(error.userInfo)")
                    abort()
                }
            }
        }
    
        // #pragma mark - Core Data stack
    
        // Returns the managed object context for the application.
        // If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
        var managedObjectContext: NSManagedObjectContext {
            if _managedObjectContext !== nil {
                let coordinator = self.persistentStoreCoordinator
                if coordinator != nil { //THIS LINE
                    _managedObjectContext = NSManagedObjectContext()
                    _managedObjectContext!.persistentStoreCoordinator = coordinator
                }
            }
            return _managedObjectContext!
        }
        var _managedObjectContext: NSManagedObjectContext? = nil
    

    我遇到了新的错误:"'NSManagedObjectContext?' does not have a member named 'hasChanges'" 在这段代码中:

    func saveContext () {
            var error: NSError? = nil
            let managedObjectContext = self.managedObjectContext
            if managedObjectContext != nil {
                if managedObjectContext.hasChanges && !managedObjectContext.save(&error) { //This line
                    // Replace this implementation with code to handle the error appropriately.
                    // abort() causes the application to generate a crash log and terminate.
                    //println("Unresolved error \(error), \(error.userInfo)")
                    abort()
                }
            }
        }
    

2 个答案:

答案 0 :(得分:3)

原因是NSManagedObjectContext,可能是NSPersistentStoreCoordinator,不符合Equatable协议。为了使用==!=,对象需要符合此协议。

===!==在这个意义上不检查相等性。这些检查以查看两个对象实际上是否是同一个对象。没有类似的价值观。它们都指向内存中的同一个对象。

您可以在两种类型上检查这一点,因为它们是对象。这应该适合您的情况。

关于第二个问题,您的代码应如下所示:

func saveContext () {
    var error: NSError? = nil
    let managedObjectContext = self.managedObjectContext
    if let moc = managedObjectContext {
        if moc.hasChanges && !moc.save(&error) { //This line
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate.
            //println("Unresolved error \(error), \(error.userInfo)")
            abort()
        }
    }
}

此处的差异为if let moc = managedObjectContext:如果managedObjectContext不为零,则该值存储在常量moc中。否则,内部的任何内容都不会被执行。您可以阅读有关选项here的更多信息。

答案 1 :(得分:1)

self.managedObjectContext此处输入为NSManagedObjectContext,而不是NSManagedObjectContext?

你不能将var与nil进行比较,除非它是Optional<>类型,实现Equatable,或者本身是nil。