在Xcode beta 5中一切都很好但是现在在完全成熟的Xcode中我在我的App Delegate中遇到了2个类似的错误:
"cannot invoke '!=' with argument list of type '(NSManagedObjectContext, NilLiteralConvertible')"
"cannot invoke '!=' with argument list of type '(NSPersistentStoreCoordinator, NilLiteralConvertible')"
我尝试用!==替换!=,我得到了一个不同的错误。我不知道问题是什么!=。 代码:
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()
}
}
}
答案 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。