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

Posted

技术标签:

【中文标题】Swift:当变量不是可选时,处理意外的 nil 值【英文标题】:Swift: handling an unexpected nil value, when variable is not optional [duplicate] 【发布时间】:2015-03-13 10:09:51 【问题描述】:

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

let historyItem = fetchedResults.objectAtIndexPath(indexPath) as HistoryItem

historyItem 有一个 title 属性定义如下:

@NSManaged var title: String

所以在cellForRowAtIndexPath 代码中说

cell?.textLabel?.text = historyItem.title

应该没问题。 title 不是可选的,不需要解包。

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

为了稳健性,我需要编写代码以确保传递给我的程序的存储数据不会导致崩溃。但是,我不会写

if historyItem.title == nil   // gives compiler error

因为title 不是可选的,编译器不会让我这样做。如果我写

let optionalTitle:String? = historyItem.title

我仍然在该行获得运行时 EXC_BAD_ACCESS

如何检查title 是否错误地为零?

谢谢!

【问题讨论】:

我已关闭为副本,因为我认为这是同样的问题。如果这些解决方案不适用于您的情况,请告诉我,然后我将重新提出问题。 是的,情况完全一样(我在搜索中没有找到),但是那里的高分解决方案不起作用。我会问另一个问题来指出这一点。谢谢! 我在***.com/questions/29031080/…问了另一个问题 【参考方案1】:

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

【讨论】:

如果我只是将标题的类型更改为字符串?,(并通过代码更改所有使用标题的地方,将其解包)然后核心数据代码会给出运行时错误。我可以写一个迁移器,也许……但我宁愿只检查意外的 nil 值。【参考方案2】:

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

let a = ""

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

【讨论】:

看起来很有希望!不幸的是,它不起作用。如果我写 if historyItem.title as String? == nil t = "was Nil" ,那么如果 title 为 nil,我会得到 EXC_BAD_ACCESS。 试试if let historyItemTitle = historyItem.title as? String "historyItem.title not nil" else "historyItem.tile is nil" 或者,如果您将标题设为 :String!这将启用零比较。【参考方案3】:

@NSManaged var title: String 应该是 @NSManaged var title: String? 如果有可能为 nil 值。那么,可选绑定就不会出错:

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

【讨论】:

以上是关于Swift:当变量不是可选时,处理意外的 nil 值的主要内容,如果未能解决你的问题,请参考以下文章

使用 View Controller 作为辅助视图的委托失败,在展开可选时意外发现 nil

在展开可选时意外发现 nil。

Swift - 在展开可选值时意外发现 nil - 从委托调用变量

尝试将 AlamoFire JSON 响应映射到类并接收“致命错误:在展开可选时意外发现 nil”

在展开可选值 uint32 swift 时意外发现 nil

AVAudioRecorder - 展开可选时发现 nil