Swift:当变量不是可选的时,处理意外的nil值

时间:2015-03-13 10:09:52

标签: swift null optional

我有UITableViewController通过NSFetchedResultsController从Core Data加载其条目。像这样:

let historyItem = fetchedResults.objectAtIndexPath(indexPath) as HistoryItem

historyItem的{​​{1}}属性定义如下:

title

所以在代码中@NSManaged var title: String

cellForRowAtIndexPath

这一切都应该没问题。 cell?.textLabel?.text = historyItem.title 不是可选的,不需要解包。

但是,在过去,存储的Core Data已经获取了title属性的值为title的一些对象。它们存在,等待导致错误。如果其中一个对象显示在单元格中,我将在上面的Swift代码行中看到运行时地址异常,其中地址为0。

为了健壮,我需要编写代码以确保传送到我的程序的存储数据不会导致崩溃。但是,我不能写

nil

因为if historyItem.title == nil { } // gives compiler error 不是可选的,编译器不会让我。如果我写

title

我仍然在该行上获得运行时let optionalTitle:String? = historyItem.title

如何检查EXC_BAD_ACCESS错误是否为空?

谢谢!

3 个答案:

答案 0 :(得分:0)

由于您有nil值,title属性应该是可选的,您应该在核心数据模型和NSManagedObject historyItem类中将其声明为可选。

答案 1 :(得分:0)

当我在编辑器中执行此操作时,我不会收到错误,因此可能是答案:

let a = ""

if a as String? == nil {
        println("Nil")
    }
    else {
        println("Not nil")
    }

答案 2 :(得分:0)

如果有可能存在零值,则

@NSManaged var title: String应为@NSManaged var title: String?。然后,可选绑定不会出错:

if let historyItemTitle = historyItem.title {
  cell?.textLabel?.text = historyItemTitle
} else {
  cell?.textLabel?.text = "Title missing"
}