Object!= nil在Beta 5中运行但在Beta 6中不运行?

时间:2014-08-24 11:41:06

标签: swift

我离开了一个无人看管的项目好几个月,只是在上周安装了Beta 5,它在修复了 AppDelegate.swift 中的大量'nil'错误之后起作用,今天尝试了Beta 6,'nil'错误再次?

func saveContext () {
    var error: NSError? = nil
    let managedObjectContext = self.managedObjectContext
    if managedObjectContext  != nil {
        if managedObjectContext.hasChanges && !managedObjectContext.save(&error) {

            abort()
        }
    }
}

var managedObjectContext: NSManagedObjectContext {
    if _managedObjectContext == nil {
        let coordinator = self.persistentStoreCoordinator
        if coordinator != nil {
            _managedObjectContext = NSManagedObjectContext()
            _managedObjectContext!.persistentStoreCoordinator = coordinator
        }
    }
    return _managedObjectContext!
}

错误说明,特别是在这一行

if managedObjectContext  != nil {

'Cannot invoke '!=' with an argument list of type (NSManagedObjectContext, NilLiteralConvertable)'

if coordinator != nil {

'Cannot invoke '!=' with an argument list of type (NSPersistantStoreCoordinator, NilLiteralConvertable)'

它在Beta 5中有效,所以我错过了补丁说明中的任何内容吗?

1 个答案:

答案 0 :(得分:8)

这是由于Xcode 6 beta 6中的一些变化(参见release notes)。

特别是:

  

非可选类型可能不再与nil进行比较,ImplicitlyUnwrappedOptional不再符合BooleanType。

您的managedObjectContext变量属于非可选类型NSManagedObjectContext。它不能是零,所以检查没用,现在是禁止的。

我不知道您self.persistentStoreCoordinator的返回类型,但很可能它也是非可选的。

解决方案很简单:删除if项检查。他们不需要。

BTW,这个变化也引起了人们的兴趣,这个变化有点相关:

  

已经审核了大量的基础API,用于可选的一致性,删除了一个   来自其接口的大量隐式解包选项。这澄清了   它们的属性和参数的可为空性/它们的方法的返回值。这是一个持续的   从beta 5开始的努力。